Repository navigation
ios-native parity pass 1: SDK contracts, chat behavior, and account copy - #1153
Merged
AnthonyRonning merged 17 commits intoOct 13, 2026
Merged
Conversation
AnthonyRonning
marked this pull request as ready for review
October 13, 2026 07:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings the 18 bounded Research parity items to Mark's native Swift iOS branch, using its existing components and presentation conventions.
An existing saved model remains sendable when catalog loading fails; the server decides model, plan and usage authorization. Selecting a new non-Free catalog model still requires a paid plan. Web search starts enabled for new preferences and older records without a stored choice, preserves an explicit off choice, and follows the saved preference. Read-aloud blocks only a known Free plan, and images/dictation retain their paid-plan checks. Stop updates active output only, completed content and unrelated errors survive settlement, and each restored context rejection owns one alert acknowledgment that survives screen remounts. The composer shows the privacy line in empty New Chat and the mistakes disclaimer in conversations. Compact chat navigation also regains its native Menu button after model/project options, queue, media and paste sheets dismiss, and after shared camera/image covers. Native dismissal completion reconciles the retained controller without releasing another presentation’s lease.
Base:
codex-ios-native-swiftat4232814f7de039f3762526d1c20f732e2ea2f91d(Mark's draft #1152). Research reference: read-onlymasterat70cd8aa607c04c894d2a1cc0f1d2bdda673077f1. Scope follows the parity audit and pass-1 handoff. This PR targets Mark's branch, with no master rebase.R/meansapps/maple-research/frontend/src/at the reference commit.sdk/src/lib/encryptedApi.ts:592-605,transportV2/auth.ts:654-674,transportV2/runtime.ts:284-298,transportV2/session.ts:446-482,sdk/rust/src/client.rs:1235.sdk/src/lib/pcr.ts:1-19.R/billing/billingApi.ts:38-63.R/services/chatResponseErrors.ts:26-93,115-164,R/services/chatAccessError.ts:23-54,R/components/ContextLimitDialog.tsx:26-59.R/billing/billingAccess.ts:3-14,R/components/ModelSelector.tsx:245-253,R/components/UnifiedChat.tsx:3842-3851,5010,5241,R/services/tts/TTSContext.tsx:98.R/components/UnifiedChat.tsx:2668-2690,2714-2782,4937.R/components/UnifiedChat.tsx:832-850,1427-1432,2618-2639.R/components/UnifiedChat.tsx:1420-1442,1532-1533,R/components/chat/ChatTurn.tsx:98-114.R/components/markdown.tsx:103-186.R/components/UnifiedChat.tsx:3308-3382.R/components/UnifiedChat.tsx:2641-2818,4485,5485-5494,5936-5938,R/services/chatResponseErrors.ts:204-217,R/components/chat/ChatCopyButton.tsx:86-117.R/components/UnifiedChat.tsx:6128-6133,6384-6386.R/components/ModelSelector.tsx:283-362,R/components/UpgradePromptDialog.tsx:200-217.R/components/ChatHistoryList.tsx:344-360,760-809,932-953,1235-1329,1442-1611; server capservices/opensecret/src/models/responses.rs:41.R/components/settings/AccountSettings.tsx:76-81,127-142.R/routes/signup.tsx:115-121.R/components/AuthMain.tsx:31-41,R/components/settings/AboutSettings.tsx:59.R/services/chatTypographyPreferences.ts:21-37,R/services/tts/ttsPreferences.ts:1-5,40-64,R/components/settings/PreferencesSettings.tsx:321-322.Follow-up validation at
09fcb3359894db3ad1fa1dd60b6fa142240bb9bc6425bbb7and reported it looked good. That phone and its saved preference were left untouched during follow-up testing. The task-owned Local stack remains running for manual tests.Follow-up runtime artifact:
apps/maple-ios/.build/xcode-local/Build/Products/Local-iphonesimulator/Maple.app,cloud.opensecret.maple.native.dev, version 0.1.0/build 8, profile Local. Public endpoints are the same as below. The follow-up native tests used a separate task-owned iPhone 17 Pro, iOS 26.5/23F77,0C7E271E-EFE3-4D02-A317-09E3CD57F814, with ad-hoc simulator identity. Result bundle:/tmp/ios-parity-shared-presentations.xcresult.Camera hardware, actual paste input, native Photo/file picker completion and OCR remain unverified. The new hooks cover the named sheets and shared full-screen presentation path; they are not a claim that every system picker has been runtime-tested.
Earlier validation at
6425bbb7f3a7e246c47704b41d760aa51c37787fEarlier supplementary attempts remain separate: an obsolete Done-button expectation was corrected to the existing outside-dismissal control; the Free image-menu attempt exposed an empty XCTest accessibility tree; its speculative lookup workaround was reverted. A concurrent phone/iPad credential attempt failed before navigation and showed a clipboard change during entry; the same phone test passed unchanged when run serially. Desktop-coordinate misses do not override the passing native control tests.
Runtime artifact:
apps/maple-ios/.build/xcode-local/Build/Products/Local-iphonesimulator/Maple.app,cloud.opensecret.maple.native.dev, version 0.1.0/build 8, profile Local. Public origins: APIhttp://127.0.0.1:31714, billing:36972, flags:41248, auth:35694; client UUIDba5a14b5-d915-47b1-b7b1-afda52bc5fc6. Tests ran on the task-owned iOS 26.5 iPhone8EF68006-89EB-4225-938C-8D207B4506DFand iPadB2096BF9-D6BC-47D0-98DB-9FA56A45587C, with ad-hoc simulator identity and no development team or distribution credentials.Current result bundles:
/tmp/ios-parity-review-ui-ipad.xcresult,/tmp/ios-options-final-directmenu.xcresult,/tmp/ios-options-phone-signin-pro.xcresult,/tmp/ios-parity-review-local-pro-ipad-repeat.xcresult,/tmp/ios-options-phone-reference-pro-serial.xcresult,/tmp/ios-parity-review-local-free-ipad-repeat.xcresult(failed supplemental image-menu automation). Expected baseline failure:/tmp/ios-options-base-directmenu.xcresult.All changes stay inside
apps/maple-ios/andsdk/swift/; deprecated-plan grep and diff checks pass. The configured identity and OpenPGP signing remain in place. Commits use the documented MAPLE_HOOK_SKIP=1 after explicit gates: the previous wrapper chose the newer Command Line Tools SDK, and this pass deliberately excludes OCR. The hook, workflows and dependencies are unchanged. Xcode's stale Textual lockfile cleanup was inspected and restored.Before merging, GitHub reported a clean, mergeable PR with no status checks on this branch. Local package, artifact and runtime evidence does not establish provider inference, hosted OAuth, physical-device behavior, deployment or store distribution.
Earlier command tails at
6425bbb7nix develop --no-update-lock-file .#apple -c scripts/ci/sdk-swift.sh— passednix develop --no-update-lock-file .#apple -c scripts/ci/sdk-swift.sh build— passednix develop --no-update-lock-file .#apple -c env -u MAPLE_RUN_LIVE_ATTESTATION -u MAPLE_SWIFT_INTEGRATION_URL -u MAPLE_SWIFT_DEV_INTEGRATION -u MAPLE_IOS_ACCOUNT_LIVE -u MAPLE_IOS_AUTH_LIVE -u RUN_LIVE_AI -u LD -u LDPLUSPLUS -u CC -u CXX xcrun swift test --package-path apps/maple-ios --sdk /Applications/Xcode_26.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Xswiftc -warnings-as-errors --skip denseScreenshotActuallyDownscalesToTheBoundedLosslessWireImage— passednix develop --no-update-lock-file .#apple -c scripts/ci/ios-native.sh simulator-build— passedMAPLE_IOS_SWIFT_SCRATCH_PATH=/tmp/ios-parity-review-cross-build nix develop --no-update-lock-file .#apple -c scripts/ci/ios-native.sh cross-build— passedMAPLE_IOS_SIMULATOR_ID=8EF68006-89EB-4225-938C-8D207B4506DF nix develop --no-update-lock-file .#apple -c apps/maple-ios/scripts/build.sh runtime-build local— passedHistorical OCR evidence and later scope
The earlier unfiltered app run executed 460 tests and failed only
ImageScreenshotTests/denseScreenshotActuallyDownscalesToTheBoundedLosslessWireImagewith VisionFoundation._GenericObjCError.nilError. That failure was also reproduced on untouched base4232814fon this host. OCR was not rerun or modified in this review-fix pass; the user will validate it on a phone.Identity/URL schemes/xcconfig/entitlements, privacy-manifest and release-lane changes, account-activation cleanup concerns, broader conversation/recents polling, thinking-level controls, documents, guests, team management, verification and IAP remain outside this pass. The only new polling is the scoped title loop. The task-owned Local stack remains running for the user’s manual simulator tests; workspace and test evidence remain available.