Skip to content

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)

  1. Call sign + email
  2. Legal agreement (Privacy + Terms toggles)
  3. Last1 ID sign-in + veteran verification (primary auth gate)
  4. VA Service History OAuth (skippable)
  5. VA FHIR sync
  6. 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.


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/timeline pattern)

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_1 DoDs in lastvet-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.


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.


         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

  1. I3 ship target: I3a-only for first TestFlight vs require I3b before external cohort?
  2. VA prod in v1.0: Ship with sandbox VA (honest metadata) or hold public launch until VA production grant?
  3. Gate 1 placeholders: Hide Radio Check / Missions / Status stubs on Home for App Store v1?
  4. Sign in with Apple: Pursue formal ASC exemption note for Last1 ID-only auth?
  5. 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.