# Push Notification Matrix

| 항목 | 값 |
|---|---|
| Status | Active push recipient matrix |
| Owner | 공통 계약: 주우철 · 정정일 |
| Last verified | 2026-07-16 KST |
| Supersedes | 분산된 알림 수신자 표와 단순화된 push 5종 설명 |

이 문서는 ZERRO lifecycle 이벤트의 역할별 알림 수신 기준을 한 곳에서 소유한다. 앱 화면의 알림 목록, 채팅방 system card, OS push는 같은 업무 이벤트를 참조하지만 전달 계층은 분리한다.

## 원본

- 원본 문서: [0602_채팅방 알림 종류 정리](https://docs.google.com/spreadsheets/d/1FgLP5COPtsot4ZQP2Ov4-ancDxyPnZvEWBX-XSgIih4/edit?gid=0#gid=0)
- Spreadsheet: `0602_채팅방 알림 종류 정리`
- Sheet: `시트`
- 확인 범위: `A1:F13`
- 마지막 확인: 2026-07-16 KST
- 원본의 `채팅창 (3명)`은 OS push 수신자 열이 아니라 해당 handover chat room의 system card projection 대상이다.

## 역할별 수신 matrix

| 업무 이벤트 | 배출자 알람 | 배차 담당자 알람 | 운전자 알람 | 처리자 알람 | 채팅방 system card |
|---|:---:|:---:|:---:|:---:|:---:|
| 배출 신청 완료 | O |  |  |  |  |
| 배출 신청 취소 | O | O |  |  | O |
| 배차 신청 등록 |  | O |  |  | O |
| 배차 완료 | O | O | O |  | O |
| 상차 시작 |  |  | O |  |  |
| 상차 완료 | O | O | O |  | O |
| 하차 완료 | O | O | O |  | O |
| 입고 예정 |  |  |  | O |  |
| 계근 완료 |  | O |  | O | O |
| 처리 대기 |  |  |  |  |  |
| 처리 완료 |  |  |  | O |  |
| 신고 완료 | O |  |  | O | O |

## 구현 매핑

- shared contract의 `MOBILE_LIFECYCLE_CHANNEL_TARGETS`와 `MobileLifecycleNotificationEventSchema`가 앱·backend가 소비하는 기계 판정 기준이다.
- 현재 backend `NotificationCatalog`는 `loading_started`를 별도 발행하지 않는다. 운전자 [상차 시작] 액션이 체크리스트·사진·`in_transport` 전이를 한 번에 수행하고 `loading_completed`를 발행하기 때문이다.
- 따라서 Sheet의 `상차 시작` 운전자 행은 **문서상 대상은 유지하되, 별도 push 발행은 구현 gap**으로 표시한다. 상차 시작·완료를 두 단계로 분리하려면 상태 모델과 backend event contract 결정이 먼저 필요하다.
- `처리 대기`는 원본 matrix와 현재 contract 모두 수신자를 두지 않는다.
- 채팅방 열의 `O`는 3인 chat room의 system card projection을 뜻한다. OS push가 채팅방으로 deep link해야 한다는 의미가 아니며, driver는 chat viewer가 아니다.
- OS push의 잠금 화면 문구는 역할 matrix와 별개로 개인정보 최소화 정책을 따른다. 업체명·폐기물·전화번호·인계번호·주소 원문을 넣지 않는다.

## 2026-07-16 승인된 push 정책

제품 책임자는 다음 정책을 승인했다. 이 기록은 push 제품 정책의 `DECIDE` gate를 닫지만 backend 전송·운영 credential·실제 tap 검증까지 완료했다는 뜻은 아니다.

- Expo Push를 OS push의 1차 provider로 사용한다.
- 자기 자신이 만든 lifecycle 이벤트는 기본적으로 OS push에서 생략한다.
- 알림 tap은 session 복구 → role 확인 → 대상 상세 화면 이동 순서로 처리한다.
- session이 만료되거나 대상 화면으로 이동할 수 없으면 해당 역할의 알림 목록으로 fallback한다.
- driver는 chat room viewer가 아니므로 driver push가 chat deep link를 만들지 않는다.

## 남은 구현·검증 gate

- local/dev backend device token 등록·폐기·중복 upsert는 #1023에서 구현·검증됐다. 남은 것은 Expo delivery adapter
- receipt/retry/실패 보관 및 token 만료 정리
- logout·권한 거부·앱 재설치 시 token lifecycle
- notification tap의 session/role/detail 복원 실제 Android evidence
- production Expo project credential과 운영 delivery analytics
- `상차 시작`을 별도 이벤트로 발행할지 여부는 상태 모델을 바꾸는 별도 decision으로 유지

상세 transport와 payload shape는 [Realtime And Push Contract](./REALTIME_PUSH_CONTRACT.md), backend API envelope은 [API Contract](./API_CONTRACT.md), 운영 gate는 [Mobile Release Strategy](../40-mobile/RELEASE_STRATEGY.md)를 따른다.
