On iOS, type a multi-line prompt, background the app before sending, return through another task, then encounter a usage-limited run. Two different promises are now under test: the unsent draft should recover in its proper context, while a submitted run should resume from authoritative task state.
OpenAI's release notes are the latest verified official signal for this article. The July 20 entries describe iOS task transcript Mermaid, interactive forms, unsent prompt recovery across tasks/hosts/workspaces, and goals resuming blocked or usage-limited runs. Availability must be treated exactly as those notes state. This is a source-based test plan, not hands-on evidence, and unverified secondary July 27 claims are rejected.
Separate local draft from remote run
unsent draft: device text + context key + local lifecycle
submitted run: server task ID + revision + blocked/resumable state
Never turn recovered draft text into an automatic submission. Never treat a local draft timestamp as proof that remote work continued.
A test record should capture:
device: record-exact-model
os: record-exact-iOS-version
app_build: record-exact-build
network: wifi-or-cellular-or-offline
power: normal-or-low-power
start_context:
task: task-A
host: host-1
workspace: workspace-red
transition: background-then-switch-workspace
expected: draft-remains-bound-to-original-context
observed: not-run
Lifecycle matrix
| Case | Starting state | Transition | Expected check | Unsafe outcome |
|---|---|---|---|---|
| D1 | unsent prompt | background/foreground | text and cursor recover | draft silently disappears |
| D2 | unsent prompt in A | switch to task B | no text leakage into B | prompt shown in wrong task |
| D3 | unsent prompt | host/workspace change | explicit binding or warning | accidental cross-context send |
| R1 | submitted active run | app terminated | server status reconciles | duplicate submission |
| R2 | usage-limited run | limit later clears | goal resumes as documented | restart from stale input |
| R3 | blocked run | prerequisite changes | user sees changed evidence | silent resume with old approval |
| N1 | either state | offline return | local draft readable; remote unknown | false “complete” status |
For forms, test focus, keyboard dismissal, partial values, and errors. For Mermaid, verify text alternatives and zoom; release notes do not prove accessibility.
Proposed XCTest seam
Use fakes before a live account. Define DraftKey from task, host, and workspace IDs; make RunStatusSource return versioned active, blocked, or complete states.
A local test can assert that DraftKey(taskA, host1, red) never populates task B. A fake status source can return .blocked(revision: 4) before process death and .active(revision: 5) after relaunch; the UI must reconcile rather than submit again.
Normal path: backgrounding preserves the unsent draft under the exact context key. Once the user sends it, the app clears that draft only after receiving a task identity, and subsequent launches fetch run status.
Failure path: the workspace changes while a draft is present. The composer becomes read-only, labels the original context, and offers “return” or “discard”; the primary send action remains disabled. For a blocked run whose revision changed, invalidate any old approval before resumption.
Measurements
Count recovery by transition, wrong-context drafts, duplicate task IDs, stale resumptions, and time to authoritative status. Record device, OS, build, network, power mode, and exact steps; invent no battery or latency values.
Release gate
- Drafts use task, host, and workspace identity together.
- Recovery never auto-sends text or resumes authority silently.
- Submitted tasks use stable server IDs and idempotency keys.
- Offline UI distinguishes cached text from remote truth.
- Blocked/usage-limited resumption rechecks revision and prerequisites.
- Interactive forms survive keyboard, interruption, and validation failure.
- Mermaid content has a usable nonvisual representation.
- Account availability is verified against current official notes.
Limits: this matrix does not claim OpenAI's iOS behavior was executed, define its internal storage, or guarantee cross-device semantics. OS eviction, managed-device policy, provider availability, and app updates may change results.
Apply the matrix before trying another platform
MonkeyCode is separately described as an open-source AGPL-3.0 AI development platform offering an overseas online option, managed server-side cloud development environments, model/task/requirement management, and build/test/preview, free to start. I did not run these iOS cases against it. The responsible evaluation is to use the official campaign route and preserve the environment record, failure cases, and no-auto-resume rule.
Disclosure: This article promotes MonkeyCode using an official campaign link. I’m a MonkeyCode user, not affiliated with the project, and I receive no commission from this link.
AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary sources.
Top comments (0)