# 기술 결정 등록부

| 항목 | 값 |
|---|---|
| Status | Active |
| Owner | APP/기술 기준: 주우철 · Web/PC/backend/관측성: 정정일 |
| Last verified | 2026-07-16 KST |
| Supersedes | [Docs Index](../README.md)의 `Current Decisions`와 [Current](../70-progress/CURRENT.md)의 `Open Decisions` 요약. 상세 계약의 ownership은 변경하지 않는다. |

이 문서는 [constitution 2.2.1](../../.specify/memory/constitution.md) 아래에서 기술 결정의 상태와 남은 gate만 집약한다. `기준선 확정`은 채택할 기술 또는 provider 경계가 정해진 상태, `부분 확정`은 정책·shape는 채택됐지만 production 구현·검증 gate가 남은 상태, `미결정`은 구현 기준선을 정할 근거가 더 필요한 상태다. 상세 shape와 승격 조건은 링크된 정본이 계속 소유한다.

| ID | 상태 | 결정 | 결정일 | 상세 정본 | 남은 gate |
|---|---|---|---|---|---|
| AUTH | 승인됨·부분 확정 | Spring Security 기반 자체 JWT와 `roles` claim을 현재 인증 기준선으로 사용한다. 2026-07-16에 v1 one-company·초대·company admin·backend-owned duties 방향을 승인했다. 구현·권한 검증 gate는 남아 있다. | 2026-07-16 | [Auth/RBAC Boundary](../40-mobile/policies/AUTH_RBAC_BOUNDARY.md) | `duties` enum/claim과 role-duty 권한 구현, 승인·초대·복구 evidence |
| DB | 기준선 확정 | PostgreSQL 17 + Spring Data JPA(Hibernate) + Flyway를 사용한다. | 2026-07-06 | [Tech Stack](./TECH_STACK.md) | 없음 |
| OCR | 부분 확정 | Google Cloud Vision을 real provider 방향으로 채택했고, owner-approved sample/field/threshold 기준을 기록했다. 대표 production benchmark는 아직 VERIFY다. | 2026-07-14 | [Provider Adapter Contract](../20-contracts/PROVIDER_ADAPTER_CONTRACT.md) | production adapter/credential, 대표 production benchmark evidence |
| MAP | 부분 확정 | 지도 provider 방향은 네이버지도로 고정했으며 외부 지도 실행은 adapter 경계에서만 허용한다. runtime source와 opener는 별도 gate다. | 2026-07-09 | [Provider Policy](../40-mobile/policies/PROVIDER_POLICY.md) | 실제 opener, 좌표/주소 runtime source, audit policy |
| PUSH | 승인됨·부분 확정 | Expo Push를 OS push의 primary provider로 사용한다. 2026-07-16에 Google Sheet 기반 역할별 matrix, 개인정보 최소화, self suppression, tap fallback, driver chat 제외를 승인했다. local/dev device registration/storage는 #1023으로 구현·검증하고, production delivery와 실제 tap evidence는 남아 있다. | 2026-07-16 | [Push Notification Matrix](../20-contracts/PUSH_NOTIFICATION_MATRIX.md) · [Realtime/Push Contract](../20-contracts/REALTIME_PUSH_CONTRACT.md) | Expo delivery/receipt/retry, production credential, notification tap role/session 복원 |
| REALTIME | 승인됨·부분 확정 | APP root에서 local/dev STOMP-over-WebSocket transport를 주입하며 설정 부재·오류 시 explicit no-op fallback을 사용한다. 2026-07-16에 초기 single replica + DB/REST 정본 운영 방향을 승인했다. | 2026-07-16 | [Realtime/Push Contract](../20-contracts/REALTIME_PUSH_CONTRACT.md) | production broker 승격 조건, replay/idempotency, latency/SLA |
| FILE | 부분 확정 | S3-compatible presigned adapter와 private object/참여 company RBAC·10분 read·retention/deletion 정책을 채택했다. Backend local/Testcontainers 경계는 source ETag 조건부 immutable finalization, 48시간 반복 cleanup, signed read, soft-delete approval, legal hold, retention anchor fail-closed, 15분 purge claim lease를 enforce한다. Non-local S3는 private bucket/lifecycle 검증 플래그 없이 기동하지 않는다. | 2026-07-14 | [Provider Adapter Contract](../20-contracts/PROVIDER_ADAPTER_CONTRACT.md) | production bucket/credential·public access block·`staging/` lifecycle write·smoke, malware scan, 회사 종료 30일 export, 운영·컴플라이언스 승인 surface wiring |
| DOC | 부분 확정 | owner-approved lifecycle event, immutable snapshot/append-only version, correction/version reason, history access와 v1 서명·직인 제외 기준을 채택했다. production wiring은 남아 있다. | 2026-07-14 | [Provider Adapter Contract](../20-contracts/PROVIDER_ADAPTER_CONTRACT.md) | 실제 renderer/storage/version history evidence, 운영·컴플라이언스 승인 surface wiring |
| OFFLINE | 승인됨·부분 확정 | 운전자 proof durable queue의 저장·owner scope·한도·순서·retry·충돌 기준을 2026-07-16에 승인했고 SQLite/file store, backend proof handler, app-start·foreground recovery를 연결했다. 하차 사진은 Android camera-only capture에서 app-private artifact와 owner-scoped saved draft로 들어오고, loading 서명은 validated canvas PNG를 app-private file로 넘긴다. | 2026-07-17 | [Provider Policy](../40-mobile/policies/PROVIDER_POLICY.md) | network listener, process-death/replay/conflict device evidence, loading 사진과 계근 capture, Expo SQLite compatibility, logout/account switch exit evidence |
| OLBARO | 부분 확정 | Open API spec과 protocol mapping을 분석하고 backend local lifecycle 경계를 구현했다. | 2026-07-06 | [Olbaro Open API](../30-backend/OLBARO_OPEN_API.md) | 테스트 계정, HALF MODE mapping 실측, 운영 credential 전환 |

## Production Issue Gates

이 등록부는 채택된 기술 방향과 남은 gate를 요약한다. 제품·운영·법무 입력값까지 필요한 APP production issue는 [Mobile Release Strategy의 Decision Gates](../40-mobile/RELEASE_STRATEGY.md#decision-gates-before-implementation-issues)에서 `DECIDE`/`VERIFY`/`READY`로 분류한다. gate가 닫히면 상세 정본을 먼저 갱신하고, 기술 결정 상태가 바뀌는 경우에만 이 표를 함께 수정한다.

## 2026-07-16 승인 기록

제품 책임자는 [Mobile Production 승인 보드](../80-artifacts/decision-approval/mobile-production-gates.json)의 여섯 `DECIDE` gate 권장안을 승인했다.

- `DG-AUTH-01`: v1 one-company account, 최초 구성원 company admin 승인, driver는 dispatcher/company admin 초대, duties는 backend-owned claim.
- `DG-PUSH-01`: Expo Push primary, Google Sheet 역할 matrix, lock-screen 개인정보 최소화, self suppression, session→role→detail tap 복원과 알림함 fallback, driver chat deep link 제외.
- `DG-REALTIME-01`: 초기 제한 운영은 single backend replica, DB/REST를 메시지 정본으로 사용하고 scale-out 시 broker/replay를 별도 승격.
- `DG-HANDOFF-01`: typed backend runtime value와 단일 APP adapter, audit redaction, 네이버지도 방향.
- `DG-RELEASE-01`: Android Internal Track first, 초기 OTA off, immutable AAB/Sentry release/staged rollout 방향.
- `DG-OFFLINE-EXIT-01`: pending queue는 sync and exit, keep pending, cancel 중 하나를 사용자에게 명시적으로 선택하게 하며 silent discard를 금지.

이 승인으로 제품 정책 `DECIDE` gate는 `READY`가 되었지만, 운영 credential/store write, 실제 provider 표본·테스트 계정, Expo delivery/receipt/retry, notification tap runtime, Android device evidence는 닫히지 않는다. local/dev device registration/storage는 #1023에서 구현·검증됐다. 남은 운영 항목은 [Mobile Release Strategy](../40-mobile/RELEASE_STRATEGY.md)의 `VERIFY` gate와 각 contract가 계속 소유한다. 승인하지 않은 항목을 결정 완료로 승격하지 않는다.
