← back to Govarbitrage
apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.md
73 lines
# GovArbitrage — iOS Simulator Dry-Run (SUPPLEMENTARY evidence) — TK-10279
**When:** 2026-09-02T22:12:55Z (UTC)
**Device:** iPhone 17 Pro Max, iOS 26.5 (simulator udid `2061D117-F2B5-419D-82D6-E9567908D5E8`)
**Bundle:** `com.abrams.govarbitrage` · Expo SDK 57 / React Native 0.86 · app version 1.0.0
**Scope:** LOCAL dev only. No App Store Connect writes/replies/uploads/resubmits, no Apple-identity
actions (Sign in with Apple shown AVAILABLE, never tapped), no prod/data writes. This is a
supplementary simulator record + journey validation while the physical iPhone is off-network; the
physical-device App Review proof is handled separately.
## Artifacts
- **Recording:** `govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov` (h264, 1320×2868, 36.4s, 7.99 MB)
- **Stills:**
- `still-01-opportunities-list-<ISO>.png` — Opportunities list, real data
- `still-02-detail-maxbid-<ISO>.png` — Listing detail (Recommended Max Bid + Valuation)
- `still-03-settings-apple-<ISO>.png` — Settings (Sign in with Apple AVAILABLE + Test Connection + config)
- `still-04-list-return-<ISO>.png` — back on the list
## Journey validated (all screens rendered with REAL live data from https://auctions.agentabrams.com)
The app sends an empty Basic auth header (`admin:` → `Authorization: Basic YWRtaW46`), which the API
treats as UNGATED, so full analytics are returned (`gated:false`, `tier:FREE`).
1. **Cold launch → Opportunities list** — `2516 active listings`; ranked cards (#1 Late-2013 iMac,
#2/#3 MacBook Pros, #4 Vintage Apple monitor) each showing GOVDEALS source, category, MEDIUM RISK,
and the analytics columns **CURRENT BID $10 · NET PROFIT $183 · ROI 191.0% · SCORE 82**. Sort chips
(Opportunity/ROI %/Net Profit/Closing Soon/Newest) + Listings/Settings tab bar.
2. **Listing detail** (iMac, id `cmtk1nnat00eysqssvwvbewq7`, deep-linked `govarbitrage://listing/<id>`)
— GOVDEALS chip, Lot #29250-189, Toledo OH, MEDIUM RISK, Drop Ship: Easy, Imported timestamp, hero
photo, **RECOMMENDED MAX BID $104** (rounded from 103.93; current bid $10 · 0 bids), View-on-GovDeals
link, and the **Valuation** table (New Retail $900 · Avg Retail $828 · Used Low/Avg/High
$252/$315/$410 · Wholesale $189 · …).
3. **Settings** (`govarbitrage://settings`) — the whole screen fits one frame: **Sign in with Apple
button rendered and AVAILABLE (not tapped)**, Base URL `https://auctions.agentabrams.com`, Username
`admin`, Password, Save Settings, **Test Connection** button, About (GovArbitrage Mobile ·
com.abrams.govarbitrage · Expo SDK 57 / React Native 0.86).
### Detail below-the-fold data (rendered on-device below the visible fold; values from the live API)
`api-detail-appclient.json`: **Recommended Max Bid $103.93 · Net Profit $182.96 · ROI 191% ·
Annualized return · Total Investment / Expected Returns (Cost Breakdown & Profit)** + **9 Scores**
(Opportunity/Arbitrage/Demand/Velocity/Logistics/Condition/Competition/Buyer). These sections are
present in the detail ScrollView beneath the Valuation table (see the code in `app/listing/[id].tsx`).
## Build findings (native build could NOT be freshly rebuilt — captured, not guessed)
Two build attempts failed on the SDK 57 / RN 0.86 **prebuilt React Native XCFramework** toolchain:
1. `xcodebuild -configuration Release … -derivedDataPath ios/build` → EXIT 65, exact error:
`<unknown>:0: error: virtual filesystem overlay file '.../ios/Pods/React-Core-prebuilt/React-VFS.yaml' not found`
(×2) + SwiftCompile failure in `ExpoLogBox`.
2. `npx expo run:ios --configuration Release` (default DerivedData) → EXIT 65, 1 error:
`❌ Script '[CP-User] Build ExpoModulesJSI xcframework' failed`.
Both point at the new switchable-prebuilt-XCFramework script phases (React-Core-prebuilt /
ExpoModulesJSI). A `/Users/macstudio3/Projects/govarbitrage` ↔ `/Volumes/Henry/…` symlink path
duality (seen in the VFS error path) is the likely aggravator.
**What was recorded instead:** the already-installed prior **Release** build on the simulator
(universal Mach-O + embedded 2.8 MB `main.jsbundle`, v1.0.0, Aug 7). Every TS/JS source file
(`app/`, `lib/`, `components/`, `constants/`, `index.ts`) predates that binary, so it faithfully
reflects the CURRENT journey code. The only config delta since is `supportsTablet:false`
(iPad-only; irrelevant to an iPhone-simulator recording).
## Interaction limitation (why the video is deep-link-driven, not tap-driven)
Synthetic mouse taps/scrolls into the Simulator (cliclick) do NOT reach the app — macOS
Accessibility / Input-Monitoring is not granted to the terminal (TCC-blocked). The cursor moves but
button/drag events are filtered. `idb`/`idb_companion` are not installed, and an XCUITest would hit
the same failing native build. Navigation was therefore driven deterministically via the app's own
`govarbitrage://` deep-link handler (URL handler, not synthetic input), which is faithful. The one
tap-only item (the Test Connection RESULT) is independently proven: the cold-launched list loaded
2516 live listings, i.e. the exact same authenticated GET the Test Connection button issues.
### To capture the tap/scroll-only bits in a follow-up (optional, Steve-gated GUI grant)
Grant the terminal (iTerm/Terminal) **Accessibility** and **Input Monitoring** in
System Settings → Privacy & Security. Then a re-run can tap Test Connection (→ "Connected · latency ·
tier FREE") and scroll the detail to show Cost Breakdown & Profit + Scores on-screen.