# Mobile UX Evidence Register

이 문서는 ZERRO Mobile APP의 local review artifact인 `artifacts/mobile/ux-flow/index.html`을 검수 가능한 상태로 유지하기 위한 git-tracked evidence register다.

`artifacts/mobile/**`는 git 추적 대상이 아니므로, HTML과 screenshot은 사람이 보는 local output이고 이 문서가 검수 상태의 추적 가능한 기준점이다.

## Scope

- 대상: `apps/mobile` APP 화면, route, CTA, mock-first UX, Maestro/agent-device/clean screenshot evidence
- 비대상: Web/PC, 실제 Kotlin Spring backend 구현, 실제 provider SDK, 실제 realtime transport
- 기준일: 2026-07-03 KST
- Root loop: GitHub issue `#450`
- 현재 register/board issue: GitHub issue `#491`
- 현재 provider/backend decision gate issue: GitHub issue `#488`

## Source of Truth 관계

| 문서 | 역할 |
|---|---|
| `docs/MOBILE_FIGMA_SCREEN_GAP_REGISTER.md` | Figma screen-needed gap이 닫혔는지 판단 |
| `docs/MOBILE_FIGMA_NODE_COVERAGE_MATRIX.md` | UX index의 partial/placeholder node를 Figma/provider/backend gap으로 분류 |
| `docs/MOBILE_RESPONSIVE_EVIDENCE_MATRIX.md` | `#493` role shell/핵심 child surface responsive clean evidence capture 범위와 device profile |
| `apps/mobile/e2e/TEST_COVERAGE_GRAPH.md` | route, button, function coverage 정본 |
| `apps/mobile/e2e/BACK_NAVIGATION_GRAPH.md` | Android/header back hierarchy 정본 |
| `docs/MOBILE_PROVIDER_POLICY.md` | provider-pending, fallback, disabled reason 기준 |
| `artifacts/mobile/ux-flow/index.html` | local human-readable review board |

## Status Taxonomy

`partial`과 `placeholder`를 하나의 의미로 쓰지 않는다. 화면 구현 상태와 검수 증거 상태를 분리한다. Loop prompt와 PR body에서 기계적으로 참조할 때는 `surface_status`와 `evidence_status`라는 이름을 사용한다.

### Surface Status

| Status | 의미 |
|---|---|
| `closed` | Figma screen entry/surface가 mock-first APP 화면으로 닫힘 |
| `mock-covered` | 실제 provider/backend 없이 mock mutation, provider-pending, fallback, disabled reason으로 사용자 흐름이 닫힘 |
| `mock-surface-covered` | #488 문맥에서 `mock-covered`를 backend/provider decision과 대비해 부르는 이름 |
| `provider-pending-covered` | 실제 provider는 없지만 provider-pending/fallback/disabled reason surface와 stable `testID`가 검증 가능한 상태 |
| `decision-needed` | 실제 API/RBAC/provider/realtime 결정 전에는 구현을 더 진행하면 안 됨 |
| `integration-pending` | frontend shell은 있으나 실제 backend/provider/realtime 연결이 남음 |

### Evidence Status

| Status | 의미 |
|---|---|
| `report-linked` | root UX index node가 상세 HTML report로 연결됨 |
| `primary-visual-linked` | root UX index node가 primary screenshot 또는 after-flow screenshot을 가짐 |
| `needs-clean-actual` | 구현은 있으나 clean ADB/overlay-free actual screenshot 보강 필요 |
| `needs-exact-figma` | Figma exact screenshot이 없거나 overview/proxy에 의존 |
| `needs-responsive-evidence` | narrow/wide/font-scale evidence 보강 필요 |
| `decision-only` | 화면 evidence보다 decision backlog 설명이 정본인 node |
| `blocked-by-contract` | provider/API/RBAC/status enum 결정 전 구현 금지 |

## Evidence Gate

검수 100%는 “화면이 몇 개 구현됐는가”가 아니라 아래 항목이 node별로 설명되는 상태다.

1. Figma exact node 또는 provider/backend policy 근거
2. 현재 route/surface와 entry path
3. stable `testID` 또는 Maestro flow
4. red box/E-label overlay 없는 clean actual screenshot, 또는 실제 provider/backend decision-only 사유
5. 상세 report 링크
6. 남은 gap이 frontend UI gap인지, backend/provider/realtime decision인지 분리

## #488 Provider/Backend Placeholder Gate

`#488`의 목적은 provider/backend placeholder를 새 UI 구현 대상으로 착각하지 않게 만드는 것이다. 아래 용어를 PR body, issue comment, local UX index report에서 같은 뜻으로 사용한다.

| 용어 | 뜻 | 구현 가능 범위 | 구현 금지 범위 |
|---|---|---|---|
| `provider-pending-covered` | provider가 없을 때의 APP surface가 이미 보이고 stable `testID`로 검증 가능 | disabled reason, fallback, retry/offline 안내, mock/local artifact | 실제 SDK, raw URL, phone/map/file adapter 선택 |
| `mock-surface-covered` | backend 없이 mock fixture/lifecycle로 UX가 닫힘 | mock mutation, duplicate guard, replay guard, conflict notice | Kotlin Spring request/response, DB persistence, idempotency storage |
| `decision-only` | UX evidence보다 decision backlog가 정본 | 문서 checklist, halt 조건, owner/decision issue 연결 | speculative API/RBAC/provider/realtime shape |
| `backend-contract-needed` | 실제 backend/auth/RBAC/persistence 계약 필요 | mock role routing, invalid role fallback, placeholder copy | auth provider, session token, authz middleware, duties enum 확정 |
| `realtime-contract-needed` | realtime/chat/read-state/message persistence 계약 필요 | mock chat, read-state summary, local attachment draft | websocket/SSE/provider 선택, message DB schema, server read receipt |

`missing:*`와 `partial:*` 토큰은 UX index/register의 decision marker다. 앱 코드의 stable `testID`가 아니며, Maestro selector 또는 visible text selector로 사용하지 않는다.

| UX node | 현재 covered surface | 남은 decision | #488 gate |
|---|---|---|---|
| `provider-decision-backlog` | local detail report가 provider/backend/realtime/auth backlog를 한 곳에 설명 | provider, backend, realtime, auth/RBAC owner와 decision issue | `decision-only`: 문서/issue checklist만 허용 |
| `backend-auth-placeholder` | onboarding role routing, invalid role fallback, future `auth.provider-pending.*` 후보 | auth provider, session/token, backend authz, `duties[]` enum | `backend-contract-needed`: APP에서 shape 확정 금지 |
| `realtime-chat-placeholder` | common chat mock room, read-state summary, attachment provider-pending surface | realtime transport, message DB, upload persistence, backend read receipt | `realtime-contract-needed`: mock shell은 유지, persistence 금지 |
| `file-ocr-placeholder` | driver/processor OCR/upload provider-pending/error/offline/retry surface | S3/presigned upload, OCR vendor/API, file picker, offline queue | `provider-pending-covered`: provider-ready 승격 금지 |
| `external-links-placeholder` | customer support, phone, map, file viewer pending/fallback surface | customer support URL, phone provider, map deep link, signed URL | `provider-pending-covered`: adapter 결정 전 raw open 금지 |
| `edge-cases-placeholder` | dispatcher/processor conflict, empty, duplicate/replay/idempotency mock UX | concurrency, cancel/reassign mutation, idempotency persistence, cross-role offline matrix | `mock-surface-covered`: backend persistence 금지 |

## 2026-07-03 #490 Emitter Evidence Closure

`#490` 기준으로 배출자 APP의 primary comparison evidence를 다시 고정했다. 이번 closure는 새 화면 구현이 아니라 검수 증거 보강이다.

| Surface | 보강 내용 | Verification |
|---|---|---|
| `emitter-request` | Figma `118:4105`, `118:4268` exact screenshot을 재확보하고, 조건 확인/일정 선택 actual proxy를 `emitter-request-conditions-clean.png`, `emitter-request-schedule-clean.png`로 교체 | `pnpm --filter @zerro/mobile e2e:maestro:emitter-request` |
| `emitter-request` follow-up | search empty, hidden-selection validation, no-results, search result, complete card를 overlay 없는 Maestro clean screenshot으로 교체 | `pnpm --filter @zerro/mobile e2e:maestro:emitter-request-unreported` |
| `emitter-more` | root index와 Figma visual audit의 primary actual을 agent-device overlay capture에서 `emitter-more-menu-clean.png`로 교체 | `pnpm --filter @zerro/mobile e2e:maestro:emitter-more` |

남은 `emitter-notifications`, `emitter-more`, `emitter-chat`의 `missing:*` marker는 APP screen gap이 아니다. 실제 push/read-state persistence, 고객센터 provider, realtime/upload provider 결정 대기 상태를 뜻한다.

## 2026-07-03 #493 Responsive Evidence Tooling Baseline

`#493`의 첫 PR 단위는 새 APP UI 구현이 아니라 responsive evidence capture 기반 보강이다. `pnpm --filter @zerro/mobile e2e:agent-device:responsive:screenshot -- <screen>`은 기본적으로 red box/E-label overlay 없는 clean ADB screenshot을 생성한다. selector/ref 위치 확인이 필요한 경우에만 `--debug-overlay`를 명시하고, 해당 artifact는 primary actual이 아니라 selector/debug proof로만 사용한다.

대상 surface, width/font profile, pass/gap 판정은 `docs/MOBILE_RESPONSIVE_EVIDENCE_MATRIX.md`를 따른다. `#489` closure 이후 processor/common-chat 계열도 후속 responsive capture 대상으로 포함한다.

## 2026-07-03 #493 Role Shell Responsive Evidence

`#493` Step B 기준으로 role shell 5개 surface의 clean actual evidence를 확보했다. 대상은 `onboarding`, `emitter-home`, `dispatcher-home`, `driver-home`, `processor-home`이며, 각 surface는 아래 3개 profile로 캡처했다.

- baseline: `w411dp`, Android font scale `1.0`
- font-large: `w411dp`, Android font scale `1.3`
- narrow: `w375dp`, Android font scale `1.0`

대표 artifact는 `artifacts/mobile/agent-device/responsive/{surface}-w{width}dp-font-{scale}.png`이고, 한눈에 보는 local review HTML은 `artifacts/mobile/ux-flow/responsive-role-shell/index.html`이다. 두 경로 모두 git 추적 대상이 아니므로, capture 범위와 판정 기준은 `docs/MOBILE_RESPONSIVE_EVIDENCE_MATRIX.md`가 추적 가능한 정본이다.

이번 Step B는 route/function regression proof가 아니라 visual responsive evidence 보강이다. `role-shell-coverage` Maestro flow는 Metro/dev-client interruption 이후 재시도 중 hang이 발생해 이번 PR의 pass evidence로 쓰지 않는다. 대신 direct app-link 진입과 clean ADB capture로 visual proof를 남기고, 기존 route/function coverage graph의 Maestro flow 책임과 분리한다.

## 2026-07-03 #493 Emitter Child Font-Large Evidence

`#493` Step C 기준으로 배출자 child surface 3개를 font scale 1.3에서 clean ADB screenshot으로 재확보했다. 이전 `emitter-notifications`, `emitter-chat`, `emitter-more` responsive artifact는 red box/E-label overlay가 남아 있었으므로 primary actual로 쓰지 않는다.

| Surface | Profile | Clean artifact | 판정 |
|---|---|---|---|
| `emitter-notifications` | `w411dp/font 1.3` | `artifacts/mobile/agent-device/responsive/emitter-notifications-w411dp-font-1-3.png` | pass |
| `emitter-chat` | `w411dp/font 1.3` | `artifacts/mobile/agent-device/responsive/emitter-chat-w411dp-font-1-3.png` | pass |
| `emitter-more` | `w411dp/font 1.3` | `artifacts/mobile/agent-device/responsive/emitter-more-w411dp-font-1-3.png` | pass |

이번 Step C도 새 APP UI 구현이 아니라 visual responsive evidence 보강이다. Route/function coverage는 기존 `emitter-notifications`, `emitter-chat`, `emitter-more` Maestro flow가 담당하고, 실제 push/read-state/customer-support/realtime/upload provider는 기존 backend/provider decision으로 유지한다.

## 2026-07-03 Responsive Evidence Step D

`#493` Step D 기준으로 role shell과 배출자 child 외 남은 핵심 child surface 9개를 font scale 1.3에서 clean ADB screenshot으로 확보했다. 각 화면은 direct implementation shortcut이 아니라 role home CTA/tab을 통해 실제 진입한 뒤 저장했다.

| Surface | Entry | Clean artifact | 판정 |
|---|---|---|---|
| `dispatcher-dispatch` | `dispatcher.home.dispatch.cta` | `artifacts/mobile/agent-device/responsive/dispatcher-dispatch-w411dp-font-1-3.png` | pass |
| `driver-confirm` | `driver.home.dispatch-confirm.cta` | `artifacts/mobile/agent-device/responsive/driver-confirm-w411dp-font-1-3.png` | pass |
| `driver-dispatch-schedule` | `driver.home.start-transport.cta` | `artifacts/mobile/agent-device/responsive/driver-dispatch-schedule-w411dp-font-1-3.png` | pass |
| `driver-dispatch-sheet` | `driver.bottom.dispatch-sheet.tab` | `artifacts/mobile/agent-device/responsive/driver-dispatch-sheet-w411dp-font-1-3.png` | pass |
| `emitter-request` | `emitter.home.request-create.cta` | `artifacts/mobile/agent-device/responsive/emitter-request-w411dp-font-1-3.png` | pass |
| `emitter-history` | `emitter.home.history.cta` | `artifacts/mobile/agent-device/responsive/emitter-history-w411dp-font-1-3.png` | pass |
| `processor-inbound` | `processor.home.section-detail.cta` | `artifacts/mobile/agent-device/responsive/processor-inbound-w411dp-font-1-3.png` | pass |
| `processor-weighing` | `processor.home.weighing.cta` | `artifacts/mobile/agent-device/responsive/processor-weighing-w411dp-font-1-3.png` | pass |
| `common-chat` | `dispatcher.home.chat.cta` | `artifacts/mobile/agent-device/responsive/common-chat-w411dp-font-1-3.png` | pass |

이로써 `#493` target matrix의 모든 surface는 clean responsive evidence를 가진다. Role shell은 baseline/font-large/narrow 3-profile, child surface는 font-large profile 중심으로 닫고, narrow child evidence는 실제 clipping 제보 또는 UI 변경 PR에서 targeted follow-up으로 확장한다.

## 2026-07-02 UX Index Snapshot

| 항목 | 현재 값 | 해석 |
|---|---:|---|
| Root UX node | 38 | `artifacts/mobile/ux-flow/index.html`의 `data-node` 기준 |
| 상세 report 링크 | 38 / 38 | 모든 node는 `data-detail-src`를 가진다 |
| Visual/decision coverage | 33 + 5 | 33개 node는 visual comparison 또는 primary screenshot으로, 5개 node는 decision-only report로 설명 |
| Figma screen-needed gap | 0 | `#388`~`#395` closure 기준 |
| Follow-up target issue | 8 | `#488`~`#495` |

Root index에서 설명 없이 남은 node는 0개다. 이전에 clean actual 또는 primary visual이 부족했던 아래 node는 `artifacts/mobile/ux-flow/evidence-closure/index.html` 또는 decision-only report로 연결한다.

- `emitter-request`
- `emitter-history`
- `lifecycle-handoff`
- `driver-provider-placeholder`
- `processor-inbound`
- `provider-decision-backlog`
- `backend-auth-placeholder`
- `realtime-chat-placeholder`
- `file-ocr-placeholder`

이 목록은 “닫히지 않은 APP 화면” 목록이 아니다. wizard/detail report처럼 상세 HTML이 primary evidence인 경우와 backend/provider decision-only node가 섞여 있다. 화면 검수자는 root index에서 각 node를 클릭하거나 evidence closure report에서 Figma exact screenshot과 clean actual screenshot 쌍을 확인한다.

## Target Issues

| Issue | 우선순위 | 목적 |
|---|---:|---|
| `#491` | P0 | UX evidence register와 root index evidence board 구축 |
| `#490` | P1 | 배출자 exact Figma vs clean actual evidence 보강 |
| `#492` | P1 done | 배차담당자·운전자 evidence gap 보강 완료 |
| `#489` | P1 done | 처리자·공통 채팅 evidence gap 보강 완료 |
| `#488` | P1 | Provider/backend placeholder evidence gate 정리 |
| `#493` | P2 | 전 role shell·핵심 child surface 반응형 evidence 보강 |
| `#494` | P0 decision | 운전자 bottom nav 계약 충돌 정리 |
| `#495` | P2 | 공통 알림 상세 route와 카테고리별 detail 화면 고정 |

권장 loop 순서:

1. `#491`
2. `#494`
3. `#490`
4. `#492` (완료)
5. `#489` (완료)
6. `#488`
7. `#493`
8. `#495`

## Driver Bottom Nav Contract (#494)

current 운전자 APP bottom nav evidence/coverage 기준은 Figma `314:2804`의 `홈/오늘 일정/배차표` 세 항목이다. stable testID는 `driver.bottom.home.tab`, `driver.bottom.schedule.tab`, `driver.bottom.dispatch-sheet.tab`로 고정한다. `driver.bottom.chat.tab`은 current 계약이 아니다. Web/PC mock chat endpoints 역시 `emitter|dispatcher|processor` 3-role chat으로 구현되어 있으므로, driver는 chat viewer가 아니라 lifecycle assignment/notification 대상이다.

운전자 알림은 `driver.home.notifications.cta`에서 진입하는 home CTA surface이며 bottom tab이 아니다. driver lifecycle 알림에는 `chat` category가 포함되지 않으며, stray driver `chat` notification detail도 `채팅 연결 없음` provider-pending projection으로 방어한다. `driver.bottom.more.tab` 또는 운전자 More screen은 current 확정 계약이 아니다. `15:2123`의 더보기 변형은 legacy/decision context로만 보존하고, current coverage/evidence는 `314:2532`/`314:2804`와 runtime config를 따른다.

## Web Contract Alignment

Web/PC 결정은 APP UX index에서 backend/provider gap을 분류할 때 우선 참고한다. 단, Web/PC 자체 화면 구현률은 이 문서의 대상이 아니다.

| Contract area | Web/PC 결정 | APP UX index 반영 |
|---|---|---|
| Chat role | mock chat endpoints와 PC chat UI는 `emitter`, `dispatcher`, `processor` 3-role group chat이다 | APP chat viewer도 `emitter`, `dispatcher`, `processor`만 포함한다. `driver-chat-not-app-surface`는 decision node로 유지한다 |
| Driver | Web 홈은 driver를 APP 전용 역할로 분리한다 | driver는 `홈/오늘 일정/배차표`, lifecycle assignment/proof, notification 대상이다. chat/more bottom tab은 current 계약이 아니다 |
| Notification read-state | Web/PC와 backend persistence 계약은 아직 결정 전이다 | APP은 read-state summary/detail/provider-pending UI까지만 mock-covered로 둔다 |
| Provider/external | 고객센터, 전화, 지도, 파일/OCR provider는 실제 provider 결정 전이다 | UX index의 provider placeholder는 `provider-pending-covered` 또는 `decision-needed`로 분류하고, raw provider 연결을 하지 않는다 |
| Backend/API | Kotlin Spring auth/RBAC, realtime, idempotency, conflict envelope는 후속 계약이다 | `backend-auth-placeholder`, `realtime-chat-placeholder`, `processor-backend-placeholder`는 구현 gap이 아니라 blocked-by-contract node로 본다 |

## Node Evidence Matrix

| UX node | Surface status | Evidence status | Primary gap | Target |
|---|---|---|---|---|
| `onboarding` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-captured` | role shell baseline/font-large/narrow clean evidence 확보. child auth/RBAC provider는 후속 계약 | `#493` |
| `emitter-home` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-captured` | role shell baseline/font-large/narrow clean evidence 확보. 배출자 child surface font-large evidence는 Step C/D로 확보했고, narrow child evidence는 실제 clipping 제보 또는 UI 변경 PR에서 targeted follow-up | `#493` |
| `emitter-request` | `closed` | `report-linked`, `primary-visual-linked`, `comparison-linked`, `responsive-font-large-linked` | #490 기준 exact Figma와 clean actual wizard capture 비교 완료. #493 Step D 기준 font scale 1.3 clean actual 확보. backend 저장/올바로 연동은 후속 계약 | `#490`, `#493` |
| `emitter-history` | `closed` | `report-linked`, `primary-visual-linked`, `comparison-linked`, `responsive-font-large-linked` | `evidence-closure`에서 list/search Figma와 actual history/detail capture 비교. #493 Step D 기준 font scale 1.3 clean actual 확보 | `#490`, `#493` |
| `emitter-notifications` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #493 Step C 기준 font scale 1.3 clean actual 확보. backend read-state persistence, push provider는 후속 계약 | `#490`, `#493`, `#495` |
| `emitter-more` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #490 기준 clean menu actual, #493 Step C 기준 font scale 1.3 clean actual 확보. 실제 customer-support provider 연결은 후속 계약 | `#488`, `#493` |
| `emitter-chat` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #493 Step C 기준 font scale 1.3 clean actual 확보. realtime/upload/read-state persistence는 후속 계약 | `#488`, `#493` |
| `dispatcher-home` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-captured` | #492 기준 dispatcher current shell clean screenshot 보강 완료. #493 기준 role shell baseline/font-large/narrow clean evidence와 dispatcher-dispatch/common-chat child font-large evidence 확보 | `#493` |
| `lifecycle-handoff` | `mock-covered` | `report-linked`, `primary-visual-linked`, `comparison-linked` | #489 기준 `lifecycle-chat-notification-proof` fresh emulator proof 확보. 실제 backend/realtime persistence는 후속 계약 | `#488` |
| `dispatcher-dispatch` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #492 기준 dispatch list/assigned exception/in-transport disabled clean screenshot 보강 완료. #493 Step D 기준 font scale 1.3 clean actual 확보. real cancel/reassign/concurrency는 후속 계약 | `#488`, `#493` |
| `dispatcher-notifications` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 dispatcher notification empty/read-state clean screenshot 보강 완료. backend read-state, push provider는 후속 계약 | `#495` |
| `dispatcher-more` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 dispatcher More provider-pending shell fresh proof 유지. auth/account/settings/logout provider는 후속 계약 | `#488` |
| `dispatcher-chat` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #489 기준 `common-chat-flashlist` fresh emulator proof 확보. #493 Step D 기준 common-chat font scale 1.3 clean actual 확보. realtime/upload/read-state persistence는 후속 계약 | `#488`, `#493` |
| `dispatcher-status-placeholder` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 operational exception clean screenshot 보강 완료. backend concurrency/cancel/reassign은 후속 계약 | `#488` |
| `driver-home` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-captured` | #492 기준 Figma `314:2804` current 3-tab home clean screenshot 보강 완료. #493 기준 role shell baseline/font-large/narrow clean evidence와 driver-confirm/schedule/dispatch-sheet child font-large evidence 확보 | `#493` |
| `driver-confirm` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #492 기준 confirm/contact provider-pending proof 보강 완료. #493 Step D 기준 font scale 1.3 clean actual 확보 | `#493` |
| `driver-transport` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #492 기준 오늘 일정/proof sequence clean screenshot 보강 완료. #493 Step D 기준 driver schedule font scale 1.3 clean actual 확보. real GPS/provider/backend state는 후속 계약 | `#488`, `#493` |
| `driver-route-guide` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 route guide/map fallback fresh proof 유지. real map provider/deep link는 후속 계약 | `#488` |
| `driver-loading-proof` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 loading checklist provider-state clean screenshot 보강 완료. real upload/offline persistence는 후속 계약 | `#488` |
| `driver-weighing-ocr` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 weighing OCR provider-state/offline/retry clean screenshot 보강 완료. real OCR/upload provider는 후속 계약 | `#488` |
| `driver-unloading-proof` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 unloading proof provider-state/offline/retry clean screenshot 보강 완료. real upload provider는 후속 계약 | `#488` |
| `driver-dispatch-sheet` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #492 기준 3-tab/empty/provider-pending/vehicle-change clean screenshot 보강 완료. #493 Step D 기준 font scale 1.3 clean actual 확보. real maintenance/fuel provider는 후속 계약 | `#488`, `#493` |
| `driver-notifications` | `mock-covered` | `report-linked`, `primary-visual-linked` | #492 기준 driver notification empty/read-state clean screenshot 보강 완료. backend read-state, push provider는 후속 계약 | `#495` |
| `driver-provider-placeholder` | `decision-needed` | `report-linked`, `decision-only` | #492 기준 current mock/provider-pending surfaces는 clean proof 보강 완료. map/upload/OCR/offline real provider는 #488 decision | `#488` |
| `processor-home` | `closed` | `report-linked`, `primary-visual-linked`, `responsive-captured` | #489 기준 Figma `478:3584`/`966:2529`와 fresh runtime 비교 완료. #493 기준 role shell baseline/font-large/narrow clean evidence 확보 | `#493` |
| `processor-weighing` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #489 기준 `processor-weighing` fresh emulator proof 확보. #493 Step D 기준 font scale 1.3 clean actual 확보. real OCR/upload provider는 후속 계약 | `#488`, `#493` |
| `processor-inbound` | `mock-covered` | `report-linked`, `primary-visual-linked`, `comparison-linked`, `responsive-font-large-linked` | #489 기준 Figma `966:2529`와 `processor-inbound` fresh emulator proof 확보. #493 Step D 기준 font scale 1.3 clean actual 확보. real backend conflict/idempotency persistence는 후속 계약 | `#488`, `#493` |
| `processor-chat` | `mock-covered` | `report-linked`, `primary-visual-linked`, `responsive-font-large-linked` | #489 기준 Figma `20:505`와 `common-chat-flashlist`/`lifecycle-chat-notification-proof` fresh emulator proof 확보. #493 Step D common-chat capture를 shared chat responsive evidence로 연결한다. realtime/upload/read-state persistence는 후속 계약 | `#488`, `#493` |
| `processor-notifications` | `mock-covered` | `report-linked`, `primary-visual-linked` | #489 기준 `role-shell-coverage`와 lifecycle notification detail proof 확보. backend read-state, push provider는 후속 계약 | `#495` |
| `processor-more` | `mock-covered` | `report-linked`, `primary-visual-linked` | #489 기준 `role-shell-coverage` fresh emulator proof 확보. auth/account/settings/logout provider는 후속 계약 | `#488` |
| `processor-backend-placeholder` | `decision-needed` | `report-linked`, `primary-visual-linked` | conflict envelope/idempotency persistence | `#488` |
| `provider-decision-backlog` | `decision-needed` | `report-linked`, `decision-only` | provider/backend/realtime/auth decision | `#488` |
| `backend-auth-placeholder` | `decision-needed` | `report-linked`, `decision-only`, `blocked-by-contract` | auth/RBAC/backend contract | `#488` |
| `realtime-chat-placeholder` | `decision-needed` | `report-linked`, `decision-only`, `blocked-by-contract` | realtime/read-state/upload persistence | `#488` |
| `file-ocr-placeholder` | `decision-needed` | `report-linked`, `decision-only`, `blocked-by-contract` | S3/upload/OCR/offline queue | `#488` |
| `external-links-placeholder` | `provider-pending-covered` | `report-linked`, `primary-visual-linked` | customer support/phone/map provider | `#488` |
| `edge-cases-placeholder` | `mock-covered` | `report-linked`, `primary-visual-linked` | cross-role offline/retry/concurrency | `#488`, `#493` |

## Stale 표현 금지

- `Partial = Figma APP screen gap`이라고 쓰지 않는다.
- `provider-decision-backlog`를 닫히지 않은 화면 목록처럼 쓰지 않는다.
- `provider-pending-covered`를 `provider-ready`로 해석하지 않는다.
- `missing:*`와 `partial:*` marker를 앱 selector나 구현 요구사항으로 복사하지 않는다.
- 현재 MCP 재확인을 page-level full audit으로 표현하지 않는다.
- driver Chat/More tab을 current 확정 계약처럼 쓰지 않는다. current driver bottom nav는 `홈/오늘 일정/배차표`이며, `15:2123`의 더보기 변형은 legacy/decision context로만 쓴다.
- backend 완료율과 mobile UX closure 완료율을 섞지 않는다.

## PR Checklist

Mobile UX evidence 관련 PR은 아래를 확인한다.

- [ ] 이 문서의 node matrix 또는 target issue와 연결되어 있다.
- [ ] UX index hierarchy/status가 바뀌면 local `artifacts/mobile/ux-flow/index.html`을 갱신했다.
- [ ] clean screenshot이 없으면 `comparison-linked`, `decision-only`, `blocked-by-contract` 중 하나로 표시했다.
- [ ] visual evidence는 red box/E-label overlay 없는 clean capture를 primary로 삼았다.
- [ ] provider/backend/realtime은 실제 구현하지 않고 provider-pending/disabled reason/decision backlog로 분리했다.
