Skip to content

Bind Android operational notifications and durable commands to current authority - #64

Merged
10 commits merged into
devfrom
cc-312-driver-operational
Oct 16, 2026
Merged

10 commits merged into
devfrom
cc-312-driver-operational

Conversation

@OziinG

@OziinG OziinG commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

CLEVER Driver change

알림 이동 중 편집·보고 입력을 보존하고, 서버가 확인한 현재 목적지만 표시합니다. 실기기에서 발견한 보호 알림 버튼의 잘림을 bottom SafeArea overlay로 수정했습니다. 같은 보고 명령은 오프라인·앱 재실행·승인 응답 유실 뒤에도 원래 commandId와 입력으로 재시도합니다.

격리 Android 생성은 별도 package와 mode 검증을 사용합니다. 실제 격리→일반 native 생성에서 manifest, applicationId와 synthetic Firebase 파일을 확인합니다. 일반 생성은 cleartext 속성과 격리·운영·API 환경 변수를 제거합니다. 합성 보고 사유는 명시적 검증·운영 flag와 loopback HTTP 조건에서만 주입합니다. Android local notification 도구는 추가로 suffix package를 확인합니다.

최종 검증

검사 결과
workspace·lint TypeScript, 325/325 tests, lint PASS; fail/skip 0. 보호 회귀 52/52 PASS.
실제 native 생성 격리 임시 저장소 isolated→normal 실제 prebuild 및 mode 전환·환경 변수 오염 검사 PASS. 업무용 Firebase와 서명 자료는 사용하지 않음.
실제 PostgreSQL/API + Note20 화면 로그인·날짜/배차·N01/N02/N04·출발+300초 N05·+300초 반복·실제 시작 승인 뒤 반복 중단 PASS. 시험 시각을 사용함.
N06 Android 알림창 탭 next stop과 다른 정확한 두 번째 targetStopId 화면 표시, fresh resolve 후 OPENED PASS. 합성 local notification이며 FCM 수신 증거가 아님.
보고·오프라인·재실행·응답 유실 실제 화면 입력 보존. 동일 commandId 201 응답 유실→200 duplicate=true. DB 보고/N07/보고 receipt 각각 1건.
실제 관제 브라우저 기기 보고 N07 열기·READ·ACKNOWLEDGED·RESOLVED·reload PASS. 배송지 PENDING과 주문 route version을 유지함.
인증·계정·재배정·취소 실제 shade tap에서 만료401→refresh200→resolve200. 다른 사업장·재배정·취소 뒤 stale resolve404와 안전 안내. N03은 해제 사실만 표시.
수정 APK 재검증 보호 버튼 두 개를 실제 탭. 보고 사유·설명 유지 및 명시적 이동 PASS. 새 배송원 현재 배차와 취소 후 목적지도 확인.
업무용 앱·PR61 기존 package0.1.15(26) APK split4개 hash·설치 시각 유지. PR61 exact head 유지.
독립 검토 APPROVE. safe-area 보완 후 미해결 소스 결함0.
현재 SHA CI37587364795 TypeScript·325 tests·lint·Android/iOS export PASS. Audit 단계는 기존 high20로 FAIL; 이후 정합성·whitespace 단계는 skip. 해당 로컬 검사는 PASS.
audit 기준 moderate 재검사 exit1/high20/critical0. Issue62 유지. 기준 완화·예외·검사 삭제 없음.

최종 APK: com.evnsolution.clever.driver.integration, 0.1.14(23), arm64-v8a, 45,582,315 bytes. SHA256 2c78ef20bc8522dd46d8c57965ca664727f397aaa5f8557709c2334dd98d09d7. 설치본 hash도 일치합니다. Android Debug certificate SHA256 fac61745dc0903786fb9ede62a962b399f7348f0bb6f899b8332667591033b9c입니다. 배포 서명 후보가 아닙니다.

검증 행렬·APK·화면·HTTP·DB 경계에 증거를 기록했습니다. 실제 화면 검증을 클라이언트 함수 시험으로 대체하지 않았습니다. 주요 업무 흐름의 이전 APK와 수정 후 APK 증거를 분리했습니다.

남은 차단

Issue62 audit를 유지합니다. 기존 braces/node-forge advisory에 대한 audit 예외와 강제 Expo downgrade는 적용하지 않습니다. Runtime bundle 범위는 면제 근거가 아닙니다.

실제 FCM 수신·background/terminated FCM delivery, 실차 GPS, 운영 Firebase·배포 서명, camera/POD 실제 기기 검증은 남습니다. 미전송 초안의 process 종료 후 복구를 주장하지 않습니다. 재실행 검증은 이미 저장한 보고 명령과 입력의 복구입니다.

D01/D02/D04/D05/D07과 반복 최대6회를 승인하지 않았습니다. 합성 보고 사유는 D05 승인과 다릅니다. 일반 앱은 기본 OFF입니다. P7은 별도입니다. 이 결과는 격리 실기기 업무 흐름 완료이며 운영 활성화 완료가 아닙니다.

PR61 Draft a7959e5a84393d7dc57e2caa654ea2f8edad202c와 업무용 설치·데이터·서명 자료를 보존했습니다. PR64는 Draft로 유지합니다. 병합, 운영 배포, AWS·운영 DB 변경, 실제 발송과 Play/Drive 게시는 수행하지 않았습니다.

Closes #63
Refs #61, #62
Refs EVNSolution/clever-change-control#312
Refs EVNSolution/clever-route-server#483
Refs EVNSolution/clever-dsv-web#85

Unresolved notification clicks and small user commands survive recovery without
converting reads into business events or applying stale work to another assignment.

Constraint: PR483 is unmerged and undeployed; D05 and Issue62 remain gates.
Rejected: Legacy start fallback after unknown atomic result | can duplicate partial business events.
Confidence: high
Scope-risk: moderate
Directive: Keep new APIs OFF until server, policy, security and device gates are cleared.
Tested: Typecheck, 253 tests, lint, Expo alignment, Android Hermes export, diff check and independent review.
Not-tested: Real FCM, native candidate installation, production server integration and iOS.
OziinG added 4 commits October 7, 2026 10:42
Separate inbox receipts from business reads and defer navigation until the user
finishes protected work. Recheck authority before moving and consume clicks only
after a fresh visible destination commit. Reject malformed operational identities.

Constraint: Driver PR64 management review R1-R3; dev remains the integration base
Rejected: Discarding drafts or consuming unresolved clicks | interrupts driver work and hides unresolved authority
Confidence: high
Scope-risk: moderate
Directive: Preserve the pending lease during editing, dialogs, saving and proof; never bypass Issue62
Tested: TypeScript; 319 tests; lint; Expo alignment; whitespace; independent review 66 tests
Not-tested: New native APK; real FCM; new candidate device screens; server runtime integration
Constraint: Native integration checks must not replace the business package, Firebase configuration, or production API endpoint.
Rejected: Install the PR candidate with the production application ID | This could overwrite the business install and reuse real provider configuration.
Confidence: high
Scope-risk: narrow
Directive: Use build:android:integration:apk only with an isolated local server; FCM delivery remains a separate unverified gate.
Tested: Targeted project convention tests and Expo config resolution for production and isolated modes.
Not-tested: Native APK build and device installation are pending the coordinated heavy-build window.
The Expo android config field did not reach the release manifest. Apply cleartext access through an isolated-only config plugin while production keeps its existing Firebase and network configuration.

Constraint: Only the suffix integration package may use loopback HTTP.

Rejected: android.usesCleartextTraffic app config field | Expo omitted it from the generated release manifest.

Confidence: high

Scope-risk: narrow

Directive: Keep this plugin behind CLEVER_DRIVER_ISOLATED_ANDROID and never enable cleartext in the business package.

Tested: project convention 4/4; isolated Expo prebuild; release manifest inspection; arm64 APK build and device login.

Not-tested: Real FCM delivery because the isolated build intentionally has no Firebase provider config.
Capture the fresh audit blocker, actual PostgreSQL client replay proof, native APK provenance, suffix installation, device login recovery, and remaining provider limits.

Constraint: Keep export, debug APK, installed device evidence, and real FCM evidence distinct.

Rejected: Treating runtime bundle absence as an audit waiver | Issue62 remains blocked by unpatched upstream advisories.

Confidence: high

Scope-risk: narrow

Directive: Do not describe this isolated result as production activation or release-signing evidence.

Tested: CI 37570524933; actual PostgreSQL client flow; APK manifest/signature/ABI; suffix install; synthetic device login and relaunch recovery.

Not-tested: Real FCM, release signing, native camera and permission flow, production GPS, deployment.
OziinG added 5 commits October 7, 2026 15:45
Apply the cleartext policy in both modes and use a guarded prebuild helper. The helper cleans only managed mode transitions or Firebase residue, preserves same-mode caches, and verifies package, manifest, and Firebase output before recording the mode.

Constraint: Preserve business Firebase and signing material while keeping operational features and custom API overrides off in release builds.

Rejected: Unconditional clean prebuild | It discards valid same-mode native generation and conflicts with the persistent release workspace.

Confidence: high

Scope-risk: narrow

Directive: Use the mode-aware helper for Android APK generation; do not bypass its generated-output checks.

Tested: Actual isolated-to-production nonclean prebuild; mode transition and residue guards; targeted policy tests 12/12; workspace tests 325/325, typecheck, lint, Expo alignment; diff check.

Not-tested: Business Firebase credentials, release signing, Play submission, or production deployment.
The isolated APK needs an OS notification tap that exercises the production response classifier and resolver. The scheduler accepts only authenticated inbox identities under the integration package and loopback verification guard.

Constraint: Keep FCM registration and foreground push receipts restricted to the production package.
Rejected: Add a deep link or Android broadcast backdoor | It would bypass the production notification response path.
Confidence: high
Scope-risk: narrow
Directive: Count this path as synthetic local notification evidence, never as actual FCM receipt evidence.
Tested: Targeted notification tests 17/17, targeted ESLint, full workspace checks by root, and git diff --check passed.
Not-tested: Final rebuilt APK installation and physical notification shade tap are owned by the device verification lane.
Constraint: D05 operational reasons remain unapproved and default empty
Rejected: Enable synthetic reasons for normal installs | would treat a fixture as operational policy
Confidence: high
Scope-risk: narrow
Directive: Keep the explicit verification flag and loopback API fence together
Tested: Driver typecheck, 325 tests, lint, Expo alignment, isolated APK build
Not-tested: Real FCM, live GPS, operational policies, production signing
Render the deferred-notification banner as a bottom SafeArea overlay and place both decisions in visible 44-point action buttons. This keeps the active workspace mounted while making the required actions reachable on tall Android devices.

Constraint: Preserve the pending notification, active input, and navigation acknowledgement rules.

Rejected: A normal-flow banner below the workspace | The Note20 layout clipped both actions outside the authenticated safe area.

Confidence: high

Scope-risk: narrow

Directive: Keep deferred-notification actions inside a bottom SafeArea container and retain minimum touch height.

Tested: driverNotificationWorkProtection 52/52; rendered alert safe-area edges, absolute bounds, and both 44-point actions; diff check; independent re-review APPROVE.

Not-tested: Rebuilt APK and final Note20 tap evidence; root runs these sequentially.
Constraint: Preserve PR61, business app data and the Issue62 audit gate.
Confidence: high
Scope-risk: narrow
Directive: Synthetic Android notification taps do not prove FCM or production activation.
Tested: Actual Note20 UI flows with PostgreSQL/API correlation; fixed protected actions; 325 tests; typecheck; lint; native APK and installed hash.
Not-tested: Real FCM, live vehicle GPS, production signing, camera/POD and unapproved operational policies.
@OziinG OziinG closed this pull request by merging all changes into dev in 93a8784 Oct 16, 2026
@OziinG
OziinG deleted the cc-312-driver-operational branch October 16, 2026 08:58
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.

Implement Android operational inbox, click recovery and durable execution commands

1 participant