Skip to content

Add driver phone/PIN accounts and Android 1.0 device build#121

Merged
OziinG merged 83 commits into
devfrom
cc-224-driver-ui-ux-revision
Jul 14, 2026
Merged

Add driver phone/PIN accounts and Android 1.0 device build#121
OziinG merged 83 commits into
devfrom
cc-224-driver-ui-ux-revision

Conversation

@OziinG

@OziinG OziinG commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

CLEVER PR review completion

변경 내용

  • 기존 계정은 E.164 전화번호 + 6자리 PIN으로 로그인하고, 최초 등록만 기존 Shopify 초대코드 + 새 PIN/확인을 요구한다. 이름 입력은 제거했다.
  • account access/refresh와 route-scoped driver access를 SecureStore에서 분리하고, PIN/초대코드는 저장하지 않는다.
  • account bearer로 route lookup을 수행하며 전화번호는 route lookup payload에 다시 보내지 않는다.
  • route token 401은 account refresh + route lookup + 1회 재시도하고, account 인증 만료일 때만 전화번호 + PIN 로그인으로 돌아간다.
  • 삭제/해제된 route는 권위 있는 empty/NOT_FOUND/부분 목록 응답 후 앱 캐시에서도 제거한다. 일시적 네트워크 오류는 마지막 안전 캐시를 유지한다.
  • 기존 UI/UX 수정, 인앱 증빙 카메라, Android 네이티브 프로젝트, 앱 버전 1.0.0을 함께 정리했다.
  • 인증/릴리스/개인정보 문서를 현재 구현에 맞췄다.

Shopify 가입/초대 요청 제외

Shopify 가입/초대 생성은 사용자/스토어 관리자가 직접 수행한다. 앱, 서버 변경, agent 자동화는 Shopify 가입/초대 요청을 생성하거나 전송하지 않는다. 이번 작업에서도 해당 요청은 전혀 보내지 않았다.

서버 선행조건

  • EVNSolution/shopify-clever#136 merge: 2225849523fb08120f0fa15e525ecd4f74abc4da
  • production deploy workflow: 29313951956 succeeded
  • production backup: /mnt/clever-delivery-postgres/backups/daily/20260714T072011Z
  • legacy driver reset: 기존 driver 7건 삭제, route plan/order 유지, driver link null 처리

PR Scope Grouping Gate

  • grouping decision: single-pr
  • same document/operating-rule cleanup: 동일 target issue의 인증, route lifecycle, UI/UX, 1.0 native build 정리
  • same validation command: npm run check:workspace, npm run lint, npm run check:native-release, npm run build, Android Gradle release build, physical Android smoke
  • different app/service/contract surface: 서버 변경은 별도 EVNSolution/shopify-clever#136에서 먼저 배포 완료; 이 PR은 앱 repo만 변경
  • merge order dependency: production server deployment completed before this app PR
  • rollback unit: app commit 2244023

검증

  • npm run check:workspace: 241/241 tests passed, typecheck passed
  • npm run lint: passed
  • npm run check:native-release: passed
  • EXPO_PUBLIC_DELIVERY_SERVER_BASE_URL=https://clever-route-api.cleversystem.ai npm run build: Android/iOS export passed
  • Gradle :app:assembleRelease :app:bundleRelease for arm64-v8a: passed
  • Android SM-N981N, Android 13: APK install/update, version 1.0.0, phone page, PIN page, first-registration controls, process/log smoke passed
  • git diff --check: passed
  • APK SHA-256: 172756f11eb924fa701b534361c4abd7c019002811cc87c6b01bd0496f5e2371
  • AAB SHA-256: 8896939d51aab8f473e8754cca98b6807efd058d735e362b9a8744a407c8d560
  • Real invite registration/login not run because Shopify invitation creation is explicitly user-managed.
  • Local APK/AAB uses Android Debug certificate for device validation only. Play/iOS production signing remains owner-credentialed external work.

Concurrent Work Gate

PR 검토 에이전트 종료 조건

  • 검토 에이전트 작업은 wiki/service context 업데이트 판단으로 마친다.
  • PR 정보를 wiki에 올리지 않는다.
  • wiki에는 필요한 서비스 책임, public contract, deploy/runtime 기준, 운영 caveat만 반영한다.

Context/wiki completion

  • repo docs checked and updated: README.md, app.json, docs/project-brief.md, docs/route-access-flow.md, docs/phone-verification-plan.md, docs/release-readiness.md, docs/physical-device-smoke-runbook.md, docs/store-privacy-disclosure-draft.md, docs/repository-setup.md, docs/code-organization.md
  • context docs checked: clever-context-monorepo/docs/services/clever-driver-app/index.md
  • wiki/service context update result: not-needed
  • service doc update: target repo runtime and contract docs updated
  • wiki update: not-needed
  • clever-context-monorepo update: not-needed
  • not-needed reason: service ownership and app/server responsibility boundaries are unchanged; the credential mechanics and manual Shopify invitation boundary are recorded in the target runtime documents linked by the existing context pointer.

Linked issue close evidence

OziinG and others added 30 commits May 19, 2026 13:01
Constraint: app-only local commit; server and Shopify code remain read-only.
Rejected: require route assignment before storing driver profile | returning verified drivers need profile/token state before a route may exist.
Confidence: high
Scope-risk: moderate
Directive: Keep self-service token scope explicit before adding future server APIs.
Tested: npm test passed earlier with 156/156 after these changes.
Not-tested: per-commit isolated device smoke not run.
Constraint: app-only local commit; native build output stays ignored.
Rejected: rely only on default Android resize behavior | form fields still need explicit input navigation and checkbox affordance helpers.
Confidence: high
Scope-risk: narrow
Directive: Prefer tested UX helpers before wiring more form-specific UI behavior.
Tested: npm test passed earlier with auth form UX coverage.
Not-tested: per-commit isolated Galaxy manual keyboard pass not run.
Constraint: app-only local commit; schedule ordering remains client-side until server route history exists.
Rejected: keep Today-only copy | drivers need current and future route visibility from nearest date outward.
Confidence: high
Scope-risk: narrow
Directive: Server route APIs must return valid deliveryDate and timezone for deterministic ordering.
Tested: npm test passed earlier with route schedule coverage.
Not-tested: real multi-route production data not replayed.
Constraint: app-only local commit; server-backed tabs remain placeholder-gated.
Rejected: keep route list as the only live page | Home, Routes, Earnings, and Profile need distinct primary app surfaces.
Confidence: high
Scope-risk: broad
Directive: Do not enable history/profile/earnings/deletion live paths until server contracts and integration tests exist.
Tested: npm run typecheck, npm test, npm run lint, source-layout, native-release, architect review, and Galaxy install passed earlier.
Not-tested: visual QA screenshots across all Galaxy nav modes not captured.
Constraint: plan-only document under clever-driver-app; no server or Shopify implementation changes.
Rejected: implement delivery-server endpoints now | current authority is documentation and future prompt handoff only.
Confidence: high
Scope-risk: narrow
Directive: Treat token scope, route history migration, feedback sync, profile freshness, and timezone as server entry gates.
Tested: git diff --check docs/server-implementation-plan-driver-tabs-ia.md.
Not-tested: server implementation not attempted by design.
Keep the existing driver app IA while removing route wording drift, clarifying gated beta semantics, and making the restored iOS prebuild source reviewable under native release guardrails.

Constraint: APP-only session; server and Shopify implementation stayed out of scope.

Rejected: Direct server/API implementation | Required future server needs are captured as plan-only docs.

Rejected: Committing local Apple signing team pin | Source-controlled iOS project must not bake in local signing authority.

Confidence: high

Scope-risk: moderate

Directive: Keep route history, profile editing, account deletion, and review/tip sync visibly gated until server contracts exist.

Tested: npm run check:native-release; npm run typecheck; npm run lint; npm run check:workspace; plutil -lint iOS plist files; xcodebuild -list -project ios/CleverDriver.xcodeproj; git diff --check

Not-tested: Actual EAS/iOS archive build and Apple signing authority confirmation remain external.
Constraint: Driver auth protocol remains unchanged and diagnostics must not print full phone numbers, invite codes, tokens, cookies, or auth subjects.

Rejected: Server-side auth changes | production log evidence showed the endpoint works and the observed failure path was mobile request visibility.

Confidence: high

Scope-risk: narrow

Directive: Keep invite diagnostics redacted and environment-focused unless a new auth protocol plan is approved.

Tested: npm run typecheck; npm test src/app/authDiagnostics.test.ts; npm run lint; npm test.

Not-tested: Physical-device invite smoke; no connected/trusted device was available and Android SDK path was missing.
Drivers need newly published or reassigned routes to appear without reinstalling or signing out. The Routes tab now supports a manual refresh and refreshes when the app returns to the foreground while preserving selected route state and progress.

Constraint: Server auth and route visibility contracts remain unchanged.

Rejected: Polling routes continuously | unnecessary battery/network cost for this release.

Confidence: high

Scope-risk: narrow

Directive: Keep refresh messages non-secret and do not reset active route progress during a route-list refresh.

Tested: npm run lint; npm run typecheck; npm run test; git diff --check

Not-tested: Physical Android install before this commit.
Refresh driver route assignments on demand
Phone-only returning-driver lookup now falls back to invite-code linking when a saved session no longer has route access, and verified drivers land on the Routes empty state when no current or upcoming route is assigned.

Constraint: Server auth/API behavior remains unchanged; route absence must not masquerade as an auth failure.

Rejected: Allowing arbitrary phone-only sign-in without verification | would bypass the invite-code proof for unlinked or recreated drivers.

Confidence: high

Scope-risk: narrow

Directive: Keep route-empty outcomes distinct from auth failures and require invite-code proof before trusting unlinked phone-only sessions.

Tested: npm run lint; npm run typecheck; npm run test; git diff --check
…ut-route

Let driver login continue without assigned routes
Pin vulnerable Expo transitive dependency ranges with npm overrides so the required audit gate remains useful without a breaking Expo downgrade.

Constraint: CI runs npm audit --audit-level=moderate on every driver app PR.

Rejected: npm audit fix --force | would downgrade Expo to a breaking older release.

Confidence: medium

Scope-risk: moderate

Directive: Remove these overrides only after Expo ships fixed transitive dependency ranges.

Tested: npm ci; npm run lint; npm run typecheck; npm run test; npm audit --audit-level=moderate; npm run build; git diff --check
Keep the Expo dependency range at the patch expected by the project health check so main stays deployable after the audit override change.

Constraint: GitHub Actions runs npx expo install --check after build and audit.

Rejected: Ignoring the CI alignment check | would leave main red immediately after merge.

Confidence: high

Scope-risk: narrow

Directive: Use Expo install/check output as the source of truth for patch-level alignment.

Tested: npm ci; npx expo install --check; npm run lint; npm run typecheck; npm run test; npm audit --audit-level=moderate; npm run build; git diff --check
Constraint: Production route-access lookup may include nested INVITED status on phone-only route choices.
Rejected: Requiring a server-only deploy before mobile recovery | connected Android dev builds should tolerate the current production envelope.
Confidence: high
Scope-risk: narrow
Directive: Keep token fields redacted in diagnostics and avoid strict parser rejection for additive non-secret DTO metadata.
Tested: npm run test -- src/domain/routeAccess/routeAccess.test.ts; npm run typecheck; npm run lint; npm run test; npm run build; npm audit --audit-level=moderate; npx expo install --check; git diff --check

Co-authored-by: OziinG <145884442+OziinG@users.noreply.github.com>
Constraint: Past assigned routes stay visible until server completion, and completed routes must not reappear after refresh or relogin.\nRejected: Removing only the app-side past-date filter | would leave route completion as local UI state.\nConfidence: high\nScope-risk: moderate\nDirective: Do not connect Completed/history UI until the server endpoint is explicitly planned; preserve replay before assigned-route loading.\nTested: npm run typecheck; npm run test; npm run lint; git diff --check\nNot-tested: Live Android device smoke and production deploy.
Consolidates the completed cross-session driver OSRM handoff: the app accepts additive geometry, metrics, and stop snap points from assigned-route while keeping legacy responses usable and displaying safe pending/unavailable states.

Constraint: Validate OSRM route guidance without adding sample login/session-loader/admin backdoor behavior.
Rejected: Coupling smoke validation to operational auth bypasses | route evidence must remain testable through parser scenarios and normal assigned-route data.
Confidence: high
Scope-risk: moderate
Directive: Keep OSRM fields optional and fallback copy safe until production server rollout is verified on devices.
Tested: git diff --check; npm run typecheck; npm run test (141 passed).
Not-tested: Android export/build in this consolidation pass; prior handoff reported check:workspace and build:android success.
Keeps the third verification lane from this work: after the server assigned-route OSRM contract and driver parser/display changes, internal QA can load a gated route session, reset driver state, and open native map navigation from the active stop for smoke testing.

Constraint: This is a QA/internal validation path gated by __DEV__ or EXPO_PUBLIC_ENABLE_ADMIN_SESSION, not a customer-facing login redesign.
Rejected: Dropping the restored AppRoot change as unrelated | the user clarified it is the verification step for the OSRM route work.
Confidence: high
Scope-risk: moderate
Directive: Do not enable EXPO_PUBLIC_ENABLE_ADMIN_SESSION in customer production builds unless there is an explicit internal-release gate decision.
Tested: git diff --check; npm run typecheck; npm run test (144 passed).
Not-tested: Physical Android smoke run against deployed OSRM server.
The driver route UI now treats Route Details as the re-entry/menu surface: active routes can continue tracking, each stop row opens Stop Details, and the current stop is highlighted with Processing. Route-level maps stay in Live Tracking and launch the default map app with ordered stop addresses before coordinate fallback. Top Back/Menu text controls were removed; Android hardware/gesture back and horizontal swipe now perform internal screen back, while Assigned Routes/Home still allows app exit.

Constraint: User QA found the fake in-app map misleading, Start Route -> Live Tracking had no reliable re-entry path after Back, and the top Back/Menu text controls were too high/non-functional.
Rejected: Keeping Open in Map on Route Details | Route Details should separate review/re-entry from live navigation.
Rejected: Keeping top Back/Menu text controls | navigation should use native back actions instead of placeholder header text.
Rejected: Marking every uncompleted stop as current | only the active navigation step should show Processing.
Rejected: Coordinate-first route handoff | it hides the customer-facing address context when valid stop addresses exist.
Confidence: high
Scope-risk: moderate
Directive: Keep map launch in Live Tracking, keep Route Details as the stop-selection/re-entry hub, and keep Android back consumed by in-app navigation except on Assigned Routes/Home.
Tested: git diff --check; npm run lint; npm run typecheck; npm run test; npx expo prebuild --platform android --clean; ./gradlew assembleRelease; adb install -r dist/beta/clever-driver-0.1.0-d725f87-back-actions-20260604180414.apk; Android smoke verified top Back/Menu removal, hardware Back returns Route Details to Assigned Routes instead of exiting, horizontal swipe returns Route Details to Assigned Routes, and Assigned Routes/Home Back exits to launcher.
Not-tested: Multiple-map-app chooser on a device without Google Maps as the saved default; live production route data beyond the QA session.
Route review taps now stay read-only until the driver uses the current-step controls, and the accepted truck icon is wired through Expo's iOS and Android icon config so device validation sees the selected branding.

Constraint: User requested publishing the existing dirty app changes through deployment cleanup.

Rejected: Completing route progress from route-detail stop selection | accidental taps can mark prior steps as done.

Confidence: high

Scope-risk: moderate

Directive: Keep stop selection as preview-only unless an explicit current-step completion control is invoked.

Tested: npm run test; npm run typecheck; npm run lint; npm run check:source-layout; npm run check:native-release; git diff --check

Not-tested: Physical iOS/Android install and EAS remote binary build before this commit.
Merged the current main app shell into the driver route release branch while preserving explicit stop progress, unfinished route visibility, OSRM route metrics, map handoff, and generated mobile icons. Resolved the proof-note label conflict in favor of main's current English copy so the shared MVP flow tests remain canonical, and kept release evidence generation aligned with the source-controlled iOS project.

Constraint: User requested deployment from a clean local state with the work left on main.

Rejected: Rebase/squash onto main | a merge commit preserves the existing route-validation work and avoids rewriting the already published branch history.

Confidence: high

Scope-risk: moderate

Directive: Keep route-detail stop taps preview-only; delivery progress must advance only through explicit completion/arrival actions.

Tested: npm run check:workspace; npm run lint; npm run check:native-release; npm run release:evidence:seed; npx expo install --check; npm audit --audit-level=moderate; git diff --check; npm run build

Not-tested: Owner-controlled EAS signing/store deployment and physical-device smoke evidence require external credentials/evidence gates.
Deploy driver route validation candidate to main
Render the server-provided normalized payment bucket in route, live-tracking, and stop-detail views so drivers avoid asking for payment that Woo/admin has already confirmed.\n\nConstraint: Driver app consumes server payment truth only; no login/auth redesign, payment/refund mutation, or checkout/order creation change.\nRejected: Infer payment action from legacy financialStatus/paymentStatus | those fields remain compatibility display data and can conflict with Woo payment reality.\nConfidence: high\nScope-risk: narrow\nDirective: Keep malformed normalizedPaymentStatus responses fail-fast until a versioned compatibility plan is approved.\nTested: npm run check:workspace; npm run lint; npm run typecheck; npm run build; npm run check:native-release; git diff --check.\nNot-tested: Physical iOS/Android device smoke, EAS build submission, and store/private distribution approval evidence.
Show canonical Woo payment status in driver app
Uses the signed static preview contract when present and keeps the existing noninteractive mock as the safe fallback.

Constraint: No mobile map SDK dependency is being introduced for this first rollout.

Rejected: Native interactive map integration | Server-generated preview is the urgent first step and avoids new app-store/runtime permissions.

Confidence: high

Scope-risk: narrow

Directive: Keep fallback copy visible for missing, expired, or failed preview images until device smoke proves production stability.

Tested: npm run typecheck

Not-tested: Real-device image loading against production preview URL remains an external gate.
Constraint: Drivers need to verify the server-generated route preview before starting a production route.

Rejected: Require Start Route to see the preview | that records a route-start event just to inspect the map.

Confidence: high

Scope-risk: narrow

Directive: Keep this preview non-interactive; turn-by-turn navigation remains behind Open in Map.

Tested: npm run typecheck; npm test -- src/domain/route/assignedRoute.test.ts; Android SM-N981N Route Details screenshot loaded server PNG preview.
Avoid cropping server-rendered route previews on narrow mobile cards by preserving the full image inside the preview frame.\n\nConstraint: Static preview PNG is wider than the mobile detail card and must show the whole route until interactive maps ship.\nRejected: Leaving resizeMode cover | It hides route segments and stop markers on real devices.\nConfidence: high\nScope-risk: narrow\nDirective: Do not use cover for route previews unless the image aspect ratio and visible bounds are explicitly tested on phones.\nTested: npm run typecheck; npm test -- src/domain/route/assignedRoute.test.ts\nNot-tested: Fresh on-device screenshot after this visual-only resize change.
Prevent the saved-session restore effect from retriggering when the selected route changes, and avoid blocking the home transition on secure storage persistence or toast rendering.\n\nConstraint: Home must not alternate between empty and assigned-route states during automatic app restore.\nRejected: Retrying route restore on every selectedRouteId change | It can loop route loading and visibly flicker the Home screen.\nConfidence: high\nScope-risk: narrow\nDirective: Keep startup restore effects guarded to one attempt unless the user explicitly refreshes routes.\nTested: npm run typecheck; npm test -- src/domain/route/assignedRoute.test.ts src/app/driverMainTabs.test.ts src/app/config/driverRuntimeConfig.test.ts; Android reload screenshots /tmp/clever-driver-home-restore-loop-fix.png and /tmp/clever-driver-home-restore-loop-fix-later.png.\nNot-tested: Release-mode performance trace.
OziinG and others added 20 commits June 15, 2026 14:57
Current Task should read like normal task context instead of an oversized callout, while its paired actions stay visually even.\n\nConstraint: Keep the change scoped to Current Task density and avoid broader route-session redesign.\nRejected: Shrink global button defaults | Other screens rely on the existing button hierarchy.\nConfidence: high\nScope-risk: narrow\nDirective: Use the compact button path for dense in-card actions that must share height.\nTested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check\nNot-tested: Device/manual visual smoke
Route Sequence stop rows should show only the basic stop address, without recipient or generic helper subtitles.\n\nConstraint: Keep depot/progress state intact and avoid changing stop detail or map behavior.\nRejected: Keep full formatted address | City/province/postal/country clutter made the sequence too heavy.\nRejected: Keep recipient subtitle | The requested sequence view should leave only the address.\nConfidence: high\nScope-risk: narrow\nDirective: Use formatStopStreetAddress for compact in-session address lists.\nTested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check\nNot-tested: Device/manual visual smoke
Driver App CI should remain available for manual verification without spending Actions minutes on every PR or push.\n\nConstraint: Reduce GitHub Actions cost while preserving an on-demand verification path.\nRejected: Delete the workflow entirely | Manual CI is still useful before merge or release checks.\nConfidence: high\nScope-risk: narrow\nDirective: Re-enable automatic pull_request/push triggers only when CI budget policy is settled.\nTested: git diff --check\nNot-tested: GitHub manual workflow dispatch UI after push
Route Sequence should keep completed and upcoming stops quiet while making the active step easy to scan.

Constraint: Keep the change scoped to Route Sequence typography.

Rejected: Bold every route sequence address | It would reintroduce noisy emphasis across the list.

Confidence: high

Scope-risk: narrow

Directive: Keep timelineTitle regular by default and add emphasis through state-specific styles only.

Tested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual visual smoke
Arrival completion should talk about delivery photos and clear next actions, not internal proof-media records or upload identifiers.

Constraint: Keep existing proof capture/upload behavior and offline retry semantics unchanged.

Rejected: Expose proof media ids and raw upload errors | Those are implementation details and create noisy warnings for drivers.

Confidence: high

Scope-risk: narrow

Directive: Keep ProofMediaUploadResult reasons for control flow, but map user-facing copy to short delivery-photo language.

Tested: npm test -- src/domain/proof/proofMediaUpload.test.ts src/domain/proof/proofPhotoCapture.test.ts src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual visual smoke
The stop completion screen should not explain missing or successful photo state; the final completion action already enforces the required delivery photo.

Constraint: Preserve capture, upload, offline retry, and final required-photo validation behavior.

Rejected: Replace Proof Item with another placeholder phrase | Any placeholder copy still adds unnecessary explanation before completion.

Confidence: high

Scope-risk: narrow

Directive: Surface photo messages only for actionable problems, not normal selected/uploaded state.

Tested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual visual smoke
Stop completion should present one Add Photo action and let the driver choose camera or album only when needed.

Constraint: Expo ImagePicker keeps camera and library launches as separate native entry points.

Rejected: Rely on camera access inside the system album picker | iOS and Android picker UIs do not provide a stable cross-platform camera choice contract.

Confidence: high

Scope-risk: narrow

Directive: Keep the app-level Add Photo choice as the stable UX boundary; do not expose separate photo source buttons on the form.

Tested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual native picker smoke
The Add Photo flow should follow the driver app design system instead of showing the native alert style.

Constraint: Use existing text-only, rounded white surface, thin border, soft shadow, and blue action treatment from design.md/AppRoot styles.

Rejected: Keep Alert.alert for photo source selection | Native alert styling conflicts with the app's card/sheet visual system.

Confidence: high

Scope-risk: narrow

Directive: Keep photo source selection as an app-owned sheet; reserve native pickers only for camera/library entry after the driver chooses a source.

Tested: npm test -- src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual native picker smoke
Android system navigation can cover app-owned bottom sheets, so bottom-attached app chrome needs an explicit clearance rule.

Constraint: Preserve the existing 56px Android bottom chrome clearance and apply it to the custom Add Photo sheet.

Rejected: Rely on SafeAreaView alone | React Native SafeAreaView did not protect this custom absolute-positioned bottom sheet from Android 3-button navigation.

Confidence: high

Scope-risk: narrow

Directive: Any future app-owned bottom sheet or bottom chrome should use APP_OWNED_BOTTOM_CHROME_ANDROID_CLEARANCE on Android.

Tested: npm test -- src/app/appLayoutMetrics.test.ts src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Physical Android 3-button navigation smoke
Photo source choices need clearer action affordances without making the bottom sheet visually taller than necessary.

Constraint: Preserve Android bottom-navigation clearance and app-owned sheet styling.

Rejected: Keep the native secondary cancel button | It cannot express the requested red cancel affordance cleanly inside this sheet.

Confidence: high

Scope-risk: narrow

Directive: Keep photo source buttons compact; avoid increasing sheet height when changing color or state styling.

Tested: npm test -- src/app/appLayoutMetrics.test.ts src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check

Not-tested: Device/manual visual smoke
The photo source sheet should keep three actions visually consistent while preserving Android navigation clearance without excess empty space.

Constraint: Keep the requested blue source borders and red cancel treatment.
Rejected: Increase sheet height to express action separation | It made the sheet feel too high and heavy.
Confidence: high
Scope-risk: narrow
Directive: Keep photo sheet action and cancel button minHeight/font size aligned when changing future sheet styling.
Tested: npm test -- src/app/appLayoutMetrics.test.ts src/app/routeSessionBehavior.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace; git diff --check
Not-tested: Device/manual visual smoke
The photo source sheet needs visually equal source and cancel actions, so button boxes use fixed height and controlled text line boxes instead of relying on minHeight.

Constraint: Device screenshot showed source buttons rendering taller than Cancel despite matching minHeight intent.
Rejected: Keep minHeight-only styling | Android text metrics and padding still allowed unequal rendered button heights.
Confidence: high
Scope-risk: narrow
Directive: Keep photo sheet source and cancel actions on fixed equal height unless a visual QA pass approves a new density.
Tested: adb device screenshot inspection; git diff --check; npm test -- src/app/routeSessionBehavior.test.ts src/app/appLayoutMetrics.test.ts; npm run typecheck; npm run lint -- --quiet; npm run check:workspace
Not-tested: Fresh rebuilt on-device visual smoke after this commit
The app carried three platform-specific icon files that were byte-for-byte identical to assets/icon.png. Point every Expo icon field at the existing root icon and delete the duplicates to shrink the mobile source package without changing the displayed icon.

Constraint: Ponytail pass; no new dependencies or image tooling, and no UI/runtime behavior change.

Rejected: Add PNG optimizer dependency | Existing icon already did not shrink through the available native sips tool, and adding tooling for one asset is not worth it.

Confidence: high

Scope-risk: narrow

Directive: Re-add platform-specific icon files only if they intentionally differ from the shared root icon.

Tested: npm run check:source-layout; npm run typecheck; npm run test; npm run lint; npx --no-install expo config --type public --json; npm run build:android; git diff --check

Not-tested: Native EAS APK/IPA size, because this pass changes source icon inputs only and Android export verified references.
Photo proof already uses expo-image-picker; the barcode scanner path had no current UI wiring. Remove expo-camera/barcode-detector/ZXing and the app-side barcode proof boundary instead of carrying a native scanner for later.

Constraint: Keep current proof flow to photo upload and signature metadata only.

Rejected: Keep barcode domain hooks | no current UI need and it keeps scanner dependency semantics alive.

Confidence: high

Scope-risk: moderate

Directive: Reintroduce barcode proof only with approved UX and native dependency justification.

Tested: npm run check:source-layout; npm run typecheck; npm run test; npm run lint; npm run check:native-release; npx --no-install expo config --type public --json; npm run build:android; npm run build:ios; npm ls expo-camera barcode-detector zxing-wasm; git diff --check

Not-tested: pod install is blocked by local ios/Pods ReactNativeDependencies cache mismatch against RN 0.85.3; EAS/APK/IPA binary-size measurement not run.
The main tab bar was using the same large bottom clearance reserved for app-owned bottom sheets. Keep sheets safely above system navigation, but let tabs use the smaller Android system clearance.

Constraint: No new native inset dependency for this small Android-only spacing fix.

Rejected: Add safe-area/native-insets package | unnecessary until device variance proves fixed clearance is not enough.

Confidence: high

Scope-risk: narrow

Directive: If this still varies by Android gesture/3-button mode, add a native WindowInsets bridge or safe-area-context in a separate issue.

Tested: npm run test -- src/app/appLayoutMetrics.test.ts; npm run typecheck; npm run lint; npm run test; npm run build:android; git diff --check
Constraint: Samsung physical-device capture showed Android already ends the app window above the three-button navigation bar, so app-added bottom clearance was double spacing.

Rejected: Keep a fixed 24dp Android tab clearance | it still left the tabs visibly floating above the system bar.

Confidence: high

Scope-risk: narrow

Directive: Do not re-add Android bottom-tab clearance unless testing on a device mode where the app actually draws behind the system bar.

Tested: npm run test -- src/app/appLayoutMetrics.test.ts; npm run typecheck; gradle arm64 release build; adb install and screenshot on SM_N981N.

Not-tested: iOS physical-device layout.
Only draw the map route line when the server sends road-following geometry, while keeping numbered stop markers visible for preview orientation.

Constraint: The current mock/server geometry can be only depot/stop vertices, which renders as misleading straight-line routing.

Rejected: Render every routeGeometry as a route line | it makes non-road geometry look like real navigation.

Rejected: GeoJSON symbol markers | MapLibre glyph/layer behavior hid markers on the target Android device.

Confidence: high

Scope-risk: narrow

Directive: Server must provide dense road-following geometry before the app shows a route line.

Tested: npm run test -- src/app/routeMapGeoJson.test.ts src/app/routeSessionBehavior.test.ts; npm run typecheck; Android release build and adb install.

Not-tested: User-owned visual validation of final numbered-marker screen.
…-size

Shrink driver app assets and unused scanner code
Keep map preview markers while hiding fake route lines
Constraint: Existing Shopify invitation flow stays administrator-managed; no SMS provider or automated Shopify signup request.

Rejected: Phone-only route lookup | cannot authenticate an existing account on a new session

Confidence: high

Scope-risk: broad

Directive: Keep account bearer and route-scoped bearer separate; never persist PIN or invite code.

Tested: 241 workspace tests, typecheck, lint, native preflight, Android/iOS export, Android APK/AAB build, and SM-N981N physical smoke.

Not-tested: Real invite registration/login because Shopify invitation creation is user-managed; Play and iOS production signing.
@OziinG
OziinG force-pushed the cc-224-driver-ui-ux-revision branch from e4268e4 to 2244023 Compare July 14, 2026 08:07
Constraint: Stay within Expo SDK 56 compatible patch releases and keep the existing runtime architecture.

Rejected: Disable audit or Expo alignment gates | would hide known dependency drift from release verification

Confidence: high

Scope-risk: narrow

Directive: Re-run npm audit and expo install --check whenever the SDK 56 lockfile changes.

Tested: npm ci; 241 tests; typecheck; lint; native preflight; Android/iOS export; npm audit with zero vulnerabilities; Expo alignment; Android APK/AAB build; SM-N981N install and launch smoke.

Not-tested: Play and iOS production signing remain owner-credentialed external gates.
@OziinG

OziinG commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

CI follow-up: manual run 29316966941 passed workspace tests, lint, native preflight, evidence seed, and bundle export, then exposed transitive @babel/core/js-yaml audit findings. Commit d5621ca7c82a5a164f9698aa73bf7f273bcb05b6 applies npm non-breaking fixes and official Expo SDK 56 patch alignment. Local clean-install verification now reports 0 vulnerabilities and Dependencies are up to date. Final APK SHA-256: 172756f11eb924fa701b534361c4abd7c019002811cc87c6b01bd0496f5e2371. Final AAB SHA-256: 8896939d51aab8f473e8754cca98b6807efd058d735e362b9a8744a407c8d560.

@OziinG

OziinG commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

Final verification passed on head d5621ca7c82a5a164f9698aa73bf7f273bcb05b6: manual Driver App CI run 29317601515 completed successfully. Workspace tests, lint, native preflight, release evidence seed, Android/iOS export, npm audit, Expo dependency alignment, and whitespace checks all passed. Shopify signup/invitation creation remains explicitly user-managed and was not requested or sent.

@OziinG
OziinG merged commit 02ab0de into dev Jul 14, 2026
1 check passed
@OziinG
OziinG deleted the cc-224-driver-ui-ux-revision branch July 14, 2026 08:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Revise driver app UI/UX across current route workflow

2 participants