# Mobile App Privacy Review Checklist + PII Inventory

Scope: `docs/plans/2026-02-03-alga-psa-mobile-app` (Ticketing MVP + SSO), always-connected React Native app in `ee/mobile/`.

Last updated: 2026-02-03

## Goals

- Enumerate what data the mobile app stores, transmits, and potentially exposes.
- Provide a checklist to run before any external beta/GA.
- Serve as an inventory for future DPIA/PIA and security review.

## Definitions

- **Secret**: access token, refresh token, OTT, auth `state`, device identifiers used for session binding.
- **PII**: user identity, customer contact names/emails/phones, ticket subjects and comment bodies.
- **Sensitive business data**: ticket contents (subjects, descriptions, internal notes), client names, SLA/due dates.

## Data Stored On Device (Local)

### Secure storage (`expo-secure-store`)

- Mobile session (`accessToken`, `refreshToken` or equivalent), tenant id, user identity snapshot used by UI.
- Pending auth state (`state`) and one-time-token (`ott`) during login handoff.
- Per-user ticket list filters (`alga.mobile.tickets.filters.{userId}`).
- Per-ticket comment drafts (keyed by ticket id).
- Settings toggles: biometric gate enabled, hide-sensitive-notifications enabled.
- Stable device id (used only as an audit/telemetry identifier).

### In-memory only

- Ticket list results, ticket detail cache (TTL) and comments list cache (TTL).
- Transient errors, network state.

## Data Transmitted Off Device (Network)

### Authentication

- System browser opens `GET {BASE_URL}/auth/signin` (Microsoft/Google SSO handled on the server).
- Deep link callback to app includes `state` + `ott` in URL query (must be treated as secrets).
- App exchanges OTT for mobile credential via `POST /api/v1/mobile/auth/exchange` (server-side).
- Refresh/revoke via `POST /api/v1/mobile/auth/refresh` and `POST /api/v1/mobile/auth/revoke`.

### Ticketing APIs (read)

- `GET /api/v1/tickets` (list/search/filter) – includes ticket metadata; mobile requests a slim field set.
- `GET /api/v1/tickets/stats` – aggregate counts only.
- `GET /api/v1/tickets/:id` – includes ticket fields and attributes.
- `GET /api/v1/tickets/:id/comments` – includes comment text, visibility, author display name, timestamps.
- `GET /api/v1/tickets/statuses` / `GET /api/v1/tickets/priorities` – reference data.

### Ticketing APIs (write)

- `POST /api/v1/tickets/:id/comments` – transmits comment body and visibility (`is_internal`).
- `PUT /api/v1/tickets/:id/status` – status id.
- `PUT /api/v1/tickets/:id/assignment` – `assigned_to` (nullable).
- `PUT /api/v1/tickets/:id` – partial updates used for priority, due date, watchers.
- `POST /api/v1/time-entries` – duration/notes and ticket association.

### Headers and metadata

- `x-api-key` carries the mobile session access token (treat as secret).
- `x-tenant-id` identifies tenant context.
- Mobile audit headers include platform/app version/build and a stable device id.

## Logging / Error Reporting

- Logger redacts known secret keys (tokens, `ott`, `state`) before printing.
- Crash reporting scaffold exists; provider TBD; must avoid sending request/response bodies by default.

## UI/UX Exposure Risks

- Ticket subjects and comment bodies may be visible on-screen; ensure:
  - no screenshots are included in crash reports by default
  - any future push notifications obey “Hide sensitive notifications”
- Clipboard actions copy ticket id/number only (avoid copying ticket subject/body by default).

## Privacy Review Checklist (Pre-release)

### Authentication & secrets

- [ ] Tokens stored only in secure storage (Keychain/Keystore); never logged.
- [ ] Deep link handler rejects unexpected schemes/paths; `ott` + `state` not stored in plain storage.
- [ ] Logout revokes server-side refresh token/session and clears local secret material.
- [ ] Refresh token rotation verified (server-side) and failures handled safely.

### Data minimization

- [ ] Ticket list uses slim DTOs/field selection.
- [ ] Ticket detail payload reviewed; remove unused fields where possible.
- [ ] Avoid transmitting full error objects that include payloads.

### Observability

- [ ] Analytics opt-out honored; no PII in event properties.
- [ ] Crash reporting excludes request/response bodies by default.
- [ ] Logging redaction rules cover tokens, `ott`/`state`, and ticket/comment content.

### UX controls

- [ ] “Hide sensitive notifications” setting documented and defaults validated.
- [ ] Biometric gate does not block logout/session expiry flows.

### Compliance/Docs

- [ ] Privacy policy / terms reachable from Settings.
- [ ] Data retention and deletion behavior documented (server-side).

