LastVet iOS — Full App Store Publish Roadmap¶
Status: audit + roadmap (no build scope)
Date: 2026-09-08
Owner: Ryan Curry
Authority: Parallel track to LastVet Phase 1 gates (lastvet-gates). Does not replace gate DoDs; sequences the iOS work Ryan drives while other tracks run.
Related docs:
- docs/APP_STORE_READINESS.md — Apple guideline checklist (draft v1, Aug 2026; partially stale on auth copy)
- lastvet-gates/docs/architecture/LOOP1_OUTPUT_DOCUMENT_DIALOGUE_MODEL.md — Ω document-dialogue spec (web-built)
- lastvet-gates/docs/architecture/LOOP1_COORDINATION_LOOP_BUILD_PLAN.md — L1-6b veteran attestation options
- lastvet-gates/.cursor/rules/00-invariants.mdc — US App Store territories only
Executive summary¶
Where we are: LastVet iOS is a substantial Gate 0 app (Last1 ID login, Title 38 verification, VA sandbox FHIR, health record, consent/ROI, facilities, DD-214 vault, app lock, account deletion). The Home hub has action cards including a job placement loop card that deep-links to last1.app in Safari. There is no native program coordination, Ω output verification, or document-dialogue UI in iOS today.
Where Increment 4 landed: The full veteran Ω experience (submit, respond, re-submit, confirm, concern, document upload, org-review stepper, dialogue thread) lives on last1.app/member/progress only. iOS does not mirror it.
Gap to App Store publish: Not one feature — a stack of legal live URLs + WSGR-reviewed copy, 508-grade accessibility (currently partial), coordination UI convergence (native or authenticated in-app web), TestFlight soak + ASC metadata, production push entitlements, and VA production OAuth (external dependency). Repo version is 1.1.1 (build 2); App Store Connect state is not recorded in git and must be verified on the Mac.
Part 1 — Audit: where last.vet-ios is today¶
1.1 App identity and build state¶
| Item | Current value | Source |
|---|---|---|
| Bundle ID | vet.last.app |
project.yml |
| Display name | LastVet | Info.plist |
| Marketing version | 1.1.1 | project.yml, MARKETING_VERSION |
| Build number | 2 | project.yml, CURRENT_PROJECT_VERSION |
| Deployment target | iOS 17.0+ | project.yml |
| Devices | iPhone + iPad | TARGETED_DEVICE_FAMILY = 1,2 |
| Team | Last 1 Enterprises (A5TF9D2CT7) |
project.yml |
| Category | Health & Fitness | INFOPLIST_KEY_LSApplicationCategoryType |
| Encryption export | ITSAppUsesNonExemptEncryption = false |
Info.plist |
TestFlight / App Store Connect (repo gap): No App Store Connect app ID, SKU, last uploaded build number, or TestFlight cohort notes are checked into this repo. docs/APP_STORE_READINESS.md describes process but not current ASC state. Ryan action: confirm in App Store Connect what build (if any) is processing, internal vs external TestFlight, and whether a production version record exists.
CI / archive tooling: No GitHub Actions, Fastlane, or ExportOptions.plist. Archive is manual Xcode per README.md. Pre-build scripts: verify-va-oauth-config.sh, icon verify.
Push entitlements: LastVet.entitlements has aps-environment = development. Must be production for App Store push.
Territory lock (invariant): US App Store territories only. Do not enable EU or other territories without explicit Ryan decision.
1.2 What is built — veteran surfaces¶
Tabs (LastVetApp.swift)¶
| Tab | Primary surface |
|---|---|
| Home | Gate 0 action-card hub (OperatingSystemShellView) |
| Record | VA health timeline, categories, imaging upload, coordination notes (read), Onset summary |
| Consent | Grants, Part 2, disability diagnostics, secure links, audit log, ROI |
| Profile | Settings, legal links, VA diagnostics (sandbox), connected apps, account deletion |
Home hub — "Now" action cards (OperatingSystemShellView.swift, HomeActionCard.swift)¶
| Card | Behavior |
|---|---|
| Confirm veteran status | Native → Title38VerificationView (Last1 ID VCA / Title 38 gate) |
| Record sync | Switches to Record tab |
| Find mental-health care | Native → MentalHealthFacilitiesView (San Diego wedge, VA Facilities open data) |
| DD-214 Vault | Native scan/upload/share |
| Job placement loop | Reads GET /veteran/me/job-placement-loop on LastVet API; opens https://last1.app/member/progress in Safari when tapped |
| Consent / share | Native ROI flow (Form 10-5345) |
| Invite a provider | Native grant access (invite mode) |
Home hub — Gate 1 placeholders (not built)¶
| Placeholder | Status |
|---|---|
| Radio Check | UI stub only |
| Missions | UI stub only |
| Status & Progress | ProfileCompleteness stub |
Onboarding (OnboardingFlowView sequence)¶
- Call sign + email
- Legal agreement (Privacy + Terms toggles)
- Last1 ID sign-in + veteran verification (primary auth gate)
- VA Service History OAuth (skippable)
- VA FHIR sync
- Consent preferences
Main app requires isAuthenticated && isVeteranVerified.
Other native veteran features (substantial)¶
- VA OAuth (sandbox): Patient Health FHIR + Service History & Eligibility via
sandbox-api.va.gov - Health record: sync, timeline, medications, conditions, vitals, imaging envelope upload
- Consent engine: grants, revoke, Part 2, audit log, secure links
- ROI: full Form 10-5345 PDF flow
- App lock: PIN + biometrics
- Push registration: APNs device token to LastVet API
- Coordination notes: read-only in Record tab via
GET /veteran/me/coordination-notes - Crisis handoff: 988 + Veterans Crisis Line on self-report crisis path
1.3 What is NOT built (relevant to coordination / Ω)¶
| Capability | iOS status |
|---|---|
| Program coordination progress UI | None |
Ω output verification (OutputVerificationCard parity) |
None |
| Document-dialogue thread | None |
| Org review stepper (Received → Reviewed → Confirmed) | None |
| Veteran Ω actions (submit / respond / resubmit / confirm / concern) | None |
| Output document upload/download to last1.app | None |
| Native coordination loop attestation (Λ Approve/Deny) | None — Safari handoff only |
last1.app authenticated API client in iOS |
None |
| Gate 1 OS mechanics | Placeholders only |
Code search: no matches for omega, output verification, document-dialogue, or program coordination in Swift sources.
1.4 What the app connects to today¶
LastVet API (https://api.last.vet/api)¶
Both Debug and Release xcconfig point to production LastVet API (staging URL exists but unused). Veteran session: Last1 ID OAuth → POST /auth/last1/veteran/callback → optional POST /auth/veteran/session after VA patient token for FHIR-backed calls.
Representative endpoints in use: profile, consents, connections, documents, health-record sync, coordination-notes, job-placement-loop, ROI, secure links, Onset summary, audit log, account deletion, APNs registration. Full list: LastVetAPIClient.swift.
last1.id (https://auth.last1.id)¶
Primary sign-in: OAuth PKCE, redirect https://last.vet/auth/last1/callback via Universal Links (applinks:last.vet). Client ID lastvet. Issuer cutover to auth.last1.id is live in Configuration.swift.
VA Lighthouse (device-direct, sandbox)¶
- FHIR Patient Health API
- Veteran Service History & Eligibility
- OAuth redirect
https://last.vet/oauth/callback - Production VA OAuth not wired — both Debug and Release use
LastVetVAEnvironment = sandbox
last1.app (external, web only)¶
| URL | How iOS uses it |
|---|---|
https://last1.app/member/progress |
Safari open from job placement loop card |
| (no other member API calls) | — |
Increment 4 reflection: The Ω document-dialogue model, org-review ladder, deny/re-submit cycle, and attention banners are web-only on last1.app. iOS shows a read-only loop summary card on LastVet API and sends the veteran to the browser for any action.
last1.app member APIs (not called from iOS today)¶
These are what web OutputVerificationCard uses; iOS would need these for native parity:
| Action | Method | Path |
|---|---|---|
| Progress read | GET | /api/member/program-coordination/progress |
| Progress (one program) | GET | /api/member/program-coordination/progress?programId= |
| Coordination loop | GET | /api/member/coordination-loop?programId= |
| Submit output | POST | /api/member/program-coordination/outputs/:eventId/submit |
| Respond to question | POST | .../respond |
| Re-submit after denial | POST | .../resubmit |
| Confirm org-delivered output | POST | .../confirm |
| Raise concern | POST | .../concern |
| Upload document | POST | .../documents (multipart) |
| List documents | GET | .../documents |
| Download document | GET | /api/member/program-coordination/output-documents/:id/file |
| Loop attestation | POST | /api/coordination-loops/:id/attest/recipient |
Shared view-model logic to port or reuse: last1.app/shared/programCoordination/outputVerificationUi.ts.
1.5 Legal and agreements (in-app today)¶
| Item | In-app state | Gap |
|---|---|---|
| Privacy Policy link | https://last.vet/privacy (version 2026-04-03) |
WSGR review for veteran-facing legal consistent with sovereignty / no data monetization; verify live page matches linked version |
| Terms of Service link | https://last.vet/terms (version 2026-04-03) |
Same |
| Onboarding acceptance | Required toggle; persisted in LegalAcceptanceStore |
Re-accept flow if version bumps |
| Medical disclaimer | MedicalDisclaimer.swift |
Align with App Store copy rules in APP_STORE_READINESS.md |
| App Store metadata legal | Not in repo | Privacy policy URL in ASC must match in-app |
Note: docs/APP_STORE_READINESS.md still references ID.me as primary sign-in and old URLs (my.last.vet/privacy). Code uses Last1 ID and last.vet/privacy. Update readiness doc when executing publish track.
Flag for WSGR: Veteran ToS + Privacy must cover Last1 ID auth, VA OAuth read scopes, last1.app coordination data flow, document storage, 42 CFR Part 2 framing where ROI touches MH data, account deletion, and explicit no sale of veteran data / no ad monetization.
1.6 Accessibility (508 / disabled-veteran population)¶
Attestation context: Ryan indicated 508 compliance was attested to the VA. In-repo evidence of a completed iOS 508 pass was not found. Treat accessibility as a publish gate, not a done item.
| Area | Current state |
|---|---|
| VoiceOver labels | Partial — consent, ROI, record categories, timeline; Home action cards lack labels |
| Accessibility identifiers | Good coverage for UI tests (consent, legal, record filters) |
| Dynamic Type | Not implemented — LastVetTypography uses fixed point sizes |
| Reduce Motion | No explicit handling |
| Color contrast | Not documented |
| Accessibility audit / test plan | None in repo |
508 gate bar: VoiceOver-complete primary paths (Home, onboarding, Record read, Consent share/revoke, coordination handoff), Dynamic Type on all veteran-facing text, 44pt targets, crisis handoff accessible, documented test pass with disabled-veteran scenarios.
1.7 App Store readiness items already in code¶
| Requirement | Status |
|---|---|
| Account deletion in-app | Present — ProfileSettingsView.deleteAccount() |
| Legal links in-app | Present |
| Medical disclaimer | Present |
| Sign in with Apple | Not used — Last1 ID OAuth; document exemption rationale (government-adjacent identity) for ASC |
| Analytics SDKs | None found (good) |
| Health positioning copy | Documented in APP_STORE_READINESS.md; needs grep gate before submit |
1.8 Gap summary: current app → full App Store publish¶
| Gap | Severity for publish |
|---|---|
| No native or authenticated in-app coordination / Ω UI | High — veteran cannot complete VetClaims loop in-app |
| last1.app member session not integrated in iOS | High — blocks single pane of glass |
| 508 / accessibility pass incomplete | High — attestation risk |
| Legal docs WSGR + live URL/version alignment | High — App Review + VA |
| TestFlight external soak not documented complete | Medium |
| ASC metadata, screenshots, nutrition label | Medium — process work |
Push aps-environment production |
Medium — required for prod push |
| VA production OAuth (external) | Medium — sandbox OK for early TestFlight, not for prod VA data |
| CI/archive automation | Low — manual OK for v1 |
APP_STORE_READINESS.md stale auth copy |
Low — doc hygiene |
| Gate 1 OS placeholders visible on Home | Low/Medium — product polish; clarify "coming soon" vs ship |
1.9 Wireframe visual vocabulary (binding for iOS UI work)¶
Early LASTVET mockups (Figma / design comps referenced in project docs and last.vet-ios onboarding) are a visual vocabulary reference only. They are not a product or coordination model spec. When building native surfaces (especially I3b native Ω), reuse look-and-feel; do not resurrect killed product concepts.
Use from wireframes¶
| Element | Apply to iOS |
|---|---|
| Card-based layout | Home hub, Record, Consent, future Ω surfaces |
| Navy / olive palette | LastVetTypography, action cards, chrome |
| LASTVET wordmark | Onboarding, splash, tab chrome |
| Veteran-native language | Call sign, Radio Check, mission status (where Gate 1 OS ships) |
| Career Jacket / service-history layout | Profile / service-history surfaces |
| Provider directory design | Mental-health facilities wedge, future directory |
| Privacy toggles | Consent tab patterns |
Do NOT use from wireframes (deliberately stripped)¶
These belong to an earlier product version that contradicts current Phase 1 invariants and VA positioning. Never ship, mock, or reference in copy:
| Killed concept | Why |
|---|---|
Tokenomics / $LST1 / Rewards Center / Cash Out / Data Value / "earn $X/month for data sharing" |
Data-monetization model removed; unfundable; contradicts "we do NOT monetize veteran data" |
| XP / leveling / gamification ("Level 3," "Earn 50 XP") | Off the coordination-and-outcomes thesis; no build without explicit Ryan decision |
| Wireframe coordination UI ("Active Missions," steps complete, progress bars) | Old unverified-progress model |
Coordination UI follows the current model (LOOP1)¶
Native coordination (I3b) ports from last1.app Increment 4, not wireframe mission progress:
OutputVerificationCard— state, stepper, dialogue thread, documents- Org review ladder — Received → Reviewed → Confirmed (or deny with reason)
- Verified outcomes — two-source closed outputs + coordination-loop attestation
- Held record — closed/verified items on timeline (
/member/timelinepattern)
Not wireframe progress bars or "% complete" mission widgets.
Gate check before any Home/coordination UI PR: grep for $LST1, Rewards, XP, Level \d, Data Value, Cash Out, and wireframe-style mission progress bars. Fail the PR if found.
Part 2 — Roadmap: sequenced path to App Store publish¶
How this track relates to Phase 1 gates¶
- Does not unblock or replace
GATE_0.5/GATE_1DoDs inlastvet-gates. - Runs in parallel so veterans can use LastVet on device while web coordination matures.
- Consumes Increment 4 web APIs and shared Ω view-model; does not rebuild org-side ladder on iOS.
Integration strategy (decision recorded for roadmap)¶
Three options for coordination / Ω on iOS:
| Option | Description | Pros | Cons |
|---|---|---|---|
| A — Authenticated web sheet | ASWebAuthenticationSession or in-app Safari to last1.app/member/progress with Last1 ID SSO (per LOOP1_COORDINATION_LOOP_BUILD_PLAN.md §5.2) |
Fastest; full Increment 4 UI immediately; one codebase | Not true native UX; offline poor; Apple may scrutinize thin shell |
| B — Native member client | New Last1AppAPIClient + SwiftUI port of OutputVerificationCard / progress timeline |
Single pane of glass; 508 controllable; offline-friendly reads | Largest build; must track web Ω changes |
| C — Hybrid | Native progress shell + web for document preview only | Balance | Two UX modes; complexity |
Roadmap default: C phased as A → B — ship I3a (authenticated web) for TestFlight cohort quickly; I3b native Ω for App Store v1.0 public positioning as "everything in the app."
Gate I0 — Baseline and publish inventory¶
Goal: Know exactly what ships and what ASC has.
Entry: This roadmap approved.
Work:
- [ ] App Store Connect inventory: app record, last TestFlight build, version/build numbers, territory = US only
- [ ] Apple Developer Program entity = Last 1 Enterprises (Organization), not individual
- [ ] Reconcile repo 1.1.1 (2) vs last uploaded build; bump build number before next archive
- [ ] Run APP_STORE_READINESS.md §7 checklist against current binary
- [ ] Grep banned diagnostic vocabulary per §2.1
- [ ] Confirm last.vet/privacy and last.vet/terms resolve and match in-app version strings
- [ ] Document last successful device TestFlight smoke (Gate 0.5 item 6 style)
Exit: One-page inventory attached to this doc (Ryan-filled ASC fields) + checklist green or explicit exceptions.
Gate I1 — Legal and agreements live¶
Goal: App Review and VA-facing legal surface is real, linked, and consistent.
Entry: I0 complete.
Work:
- [ ] WSGR review of veteran Privacy Policy + Terms (LastVet + last1.app coordination cross-refs)
- [ ] Publish final legal on last.vet with version bump; update LastVetLegalDocuments versions in iOS
- [ ] Onboarding re-accept if versions change
- [ ] App Store Connect privacy policy URL + App Privacy nutrition label aligned with actual data flows (LastVet API, VA OAuth, last1.id, last1.app if web handoff)
- [ ] Update APP_STORE_READINESS.md auth narrative (Last1 ID, not ID.me primary)
- [ ] Crisis / medical disclaimer strings reviewed for Apple §1.4.1
Exit: Legal URLs live; WSGR sign-off recorded; in-app and ASC metadata match; no placeholder legal.
Owner note: Ryan + WSGR. Agents prepare diffs only after legal text approved.
Gate I2 — Accessibility (508) pass¶
Goal: App matches accessibility commitments for disabled veterans.
Entry: I0 complete (can parallel with I1).
Work:
- [ ] Dynamic Type: migrate LastVetTypography to scalable fonts (@ScaledMetric / .dynamicTypeSize caps)
- [ ] VoiceOver: Home action cards, hub status text, onboarding, Record timeline, Consent flows, Profile deletion
- [ ] Touch targets ≥ 44pt on primary actions
- [ ] Reduce Motion: respect @Environment(\.accessibilityReduceMotion)
- [ ] VoiceOver walkthrough script + pass/fail log (document in docs/a11y/)
- [ ] Optional: Xcode Accessibility Inspector audit on key screens
- [ ] UI tests: extend beyond consent to Home + onboarding critical paths
Exit: Documented 508 test pass on physical device with VoiceOver; no P0/P1 a11y blockers on primary veteran paths.
Gate I3 — Coordination integration (single pane of glass)¶
Goal: Veteran completes program coordination without leaving LastVet for routine actions.
I3a — Authenticated last1.app bridge (minimum viable)¶
Entry: I1 in progress; last1.app Increment 4 live on prod for Ryan/Tony cohort.
Work:
- [ ] Replace raw Safari open with authenticated session to last1.app/member/progress (and ?programId= when loop card knows program)
- [ ] Implement per LOOP1_COORDINATION_LOOP_BUILD_PLAN.md Option A (ASWebAuthenticationSession + Last1 ID session)
- [ ] Hub card copy: attention count from LastVet API proxy or lightweight last1.app HEAD/progress poll (design choice)
- [ ] Universal link / callback handling if last1.app returns to app
- [ ] VetClaims program card on Home when enrolled (not only job placement loop)
Exit: Ryan completes full Ω cycle (submit → org ladder on web → confirm/deny/resubmit) starting from LastVet hub without manual URL entry.
I3b — Native member progress (App Store v1 target)¶
Entry: I3a soak complete; shared outputVerificationUi stable.
Work:
- [ ] Last1AppAPIClient — cookie or Bearer session to last1.app member APIs (same auth as web)
- [ ] Native Progress tab or Home section: phase timeline, OutputVerificationView rendering
- [ ] Port or code-gen from outputVerificationUi.ts: stepper, dialogue, turn resolution, copy
- [ ] Document upload/download (reuse imaging patterns where possible; respect encrypted blob model)
- [ ] Veteran Ω mutations: submit, respond, resubmit, confirm, concern
- [ ] Native coordination loop card (Λ): read + Approve/Deny placement + BSL upload when applicable
- [ ] Attention banners (outputMemberAttentionCount, your-turn highlighting)
- [ ] Feature-flag aware: legacy I1a Confirm/Dispute fallback when OUTPUT_STATE_OMEGA_READ off
Exit: Tony (or Ryan) completes VetClaims preflight entirely in iOS with no browser for coordination actions.
Gate I4 — TestFlight external cohort soak¶
Goal: Real veterans on device; Bearer + Last1 ID + coordination path proven.
Entry: I2 + I3a minimum; I1 legal live.
Work:
- [ ] Archive Release → App Store Connect upload (manual or scripted)
- [ ] Beta App Review package per APP_STORE_READINESS.md §8 (update for Last1 ID sign-in notes)
- [ ] External TestFlight cohort (~10 veterans per readiness doc)
- [ ] Soak checklist: Last1 ID login, VA sandbox connect, record sync, ROI share, coordination path (I3a or I3b), account deletion, push (if enabled)
- [ ] Fix P0/P1 from soak before public submit
- [ ] Envelope encryption imaging path validated if still gated (ENVELOPE_ENCRYPTION_INTEGRATION_PLAN.md)
Exit: Soak sign-off; no open P0; build number frozen for submission.
Gate I5 — Production dependencies¶
Goal: Production-grade external integrations. Some items parallel; none should surprise at submit.
| Dependency | Owner | Blocks public launch? |
|---|---|---|
| VA Lighthouse production OAuth + FHIR | VA approval | Yes for prod VA data (sandbox OK for limited beta) |
aps-environment → production |
Ryan / Xcode | Yes for prod push |
| last1.id production issuer stability | Infra | Yes |
| last1.app prod member APIs + Ω flags | last1.app track | Yes for I3b |
| Railway teardown invariant | Infra | Compliance (no veteran-shaped data on non-BAA) |
Exit: Explicit go/no-go on VA prod vs sandbox-labeled App Store release (metadata must honestly say sandbox if VA prod not granted).
Gate I6 — App Store submission and release¶
Goal: Public App Store listing, US territories only.
Entry: I4 soak sign-off, I1 legal, I2 a11y, I3b (or documented exception if shipping I3a-only with clear metadata), I5 go/no-go documented.
Work:
- [ ] ASC metadata: name, subtitle, description (wellness framing), keywords, screenshots (fixture data), age rating, category Health & Fitness
- [ ] Privacy nutrition label final
- [ ] Export compliance / encryption questions
- [ ] Submit for Review
- [ ] Monitor rejection themes in §9 of APP_STORE_READINESS.md
- [ ] Post-approval: crisis review monitoring, version cadence
Exit: App Store live US-only; version tagged in git; this roadmap updated with shipped build number.
Part 3 — Recommended execution order (parallel tracks)¶
I0 inventory ─────────────────────────────────────────────┐
│ │
┌─────────┴─────────┐ │
I1 legal (WSGR) I2 a11y pass │
│ │ │
└──────┬───────┘ │
▼ │
I3a web bridge ──► I4 TestFlight soak │
│ │
▼ │
I3b native Ω UI ──► I4 re-soak (if needed) │
│ │
I5 prod deps (VA OAuth, push, flags) ◄────────────────────┘
│
▼
I6 App Store submit
While Ryan runs other tracks: last1.app Increment 4+ stays source of truth for Ω behavior; iOS I3b ports from shared TS where possible. Web preflight (Tony) continues on last1.app; iOS I3a can piggyback immediately after Ryan's sign-off.
Part 4 — LastVet-specific vs Onset/RadioCheck submission¶
You've shipped Onset via TestFlight → ASC before. LastVet-specific deltas:
| Topic | Onset pattern | LastVet-specific |
|---|---|---|
| Auth | Apple Sign-In / hosted GoTrue | Last1 ID OAuth + Title 38 verification gate |
| Health positioning | Patient app | VA FHIR read + wellness disclaimer discipline |
| Regulated data | PHI in app context | VA tokens in Keychain; coordination on last1.app |
| Legal | App-specific privacy | Veteran sovereignty + VA + coordination cross-refs |
| Integrations | Clinic portal | last1.app Ω + LastVet API + VA Lighthouse |
| Distribution | App Store | US territories only |
| Accessibility | Baseline | 508 attestation — higher bar |
| Beta notes | Device journey | VA sandbox credentials + Last1 ID test account guidance |
Reuse from Onset: archive → Organizer → Distribute → App Store Connect → attach build → Submit; internal-only TestFlight trap; build number monotonicity.
Part 5 — Open decisions for Ryan¶
- I3 ship target: I3a-only for first TestFlight vs require I3b before external cohort?
- VA prod in v1.0: Ship with sandbox VA (honest metadata) or hold public launch until VA production grant?
- Gate 1 placeholders: Hide Radio Check / Missions / Status stubs on Home for App Store v1?
- Sign in with Apple: Pursue formal ASC exemption note for Last1 ID-only auth?
- WSGR timing: Parallel with I2 or block I4 until legal final?
Part 6 — Document maintenance¶
Update this roadmap when: - App Store Connect build status changes - Increment 4+ changes member API contracts - WSGR legal versions ship - VA production OAuth granted - I3 option shifts (native vs web-only)
Next agent action when building: pick the lowest gate not exited (likely I0 inventory or I3a bridge after Ryan fills ASC blanks).
Audit sources: last.vet-ios tree (2026-09-08), last1.app Increment 4 web implementation, lastvet-gates architecture docs. App Store Connect state intentionally blank pending Ryan verification.