Skip to content

fix(ios): preserve drafts during command picker recovery - #497

Queued
BunsDev wants to merge 2 commits into
mainfrom
companion-recovery-pr
Queued

BunsDev wants to merge 2 commits into
mainfrom
companion-recovery-pr

Conversation

@BunsDev

@BunsDev BunsDev commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

A timed-out skill-list request currently raises the root connection alert and dismisses the new-thread sheets. This keeps the error inside the project/provider-scoped picker, retains search and the exact draft, and offers an explicit Try again action. Pairing and secret-answer fields gain Done actions so users can dismiss the keyboard before pressing Connect or Send answer.

The paired fixture consumes one armed command GET without responding; the unchanged request timeout exercises recovery through the real CompanionServer. Existing assertions remain, with added checks for explicit retry, one skill insertion, draft retention and no accidental submission. Model tests preserve cancellation, stale-result and revocation coverage.

PR #496's request-ID reset is not included. A separate regression alternates project-specific and global requests three times, checks the first-snapshot-project contract and retains the exact unsent draft. It passed without the reset independently, in all three complete local paired runs, and in hosted iPhone CI. #496 remains unchanged.

Local validation: build and workspace typecheck passed; coverage 2,327 passed / 26 skipped; native units 63 passed / zero skipped; three consecutive complete paired suites each executed 44 tests with 43 ordinary passes, the existing intentional expected-failure self-test and zero unexpected failures/skips; full E2E passed 505 desktop / four live-provider skips and seven site tests. All six iOS inputs remained unchanged through qualification and the final documentation update.

Hosted validation on signed, GitHub-verified head d3d2eee085ef101e9e044bb7502444518a5d982d: macOS, iPhone and coverage upload passed. Hosted results match the local counts: coverage 2,327 passes / 26 skips, 505 desktop passes / four live-provider skips, seven site passes, 63 native unit passes and 44 UI executions (43 ordinary passes plus one intentional expected-failure self-test; zero unexpected failures/skips). Both recovery and fresh-context tests have status Success. The expected-failure self-test is DemoWorkspaceTests/testBestEffortEvidenceDoesNotStopTheTest.

Tree: aa4bd344a9fce749c459054dda72ab948ce33e04. GitHub's tested PR merge-ref tree equals this signed head's tree. Review and checkpoint contain provenance, commands and acceptance limits; completed logs and digest-verified artifacts are retained outside the worktree.

Related to #276 and #281. Automated simulator receipts do not complete human, VoiceOver, physical-device or live-provider acceptance. The earlier unexplained three-pixel Code Review scroll failure remains historical evidence; the unchanged test passed locally and hosted at both sizes, and this change claims no Code Review repair. Ready for review; no merge or release is requested. The 2026-11-10 independent audit verifies two additional consecutive complete fresh-install suites on unchanged source and records the remaining acceptance limits.

@vercel

vercel Bot commented Nov 8, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
modex Ready Ready Preview Nov 8, 2026 9:47pm UTC

Request Review

@github-code-quality

Copy link
Copy Markdown

Code coverage overview

Languages: TypeScript

TypeScript / code-coverage-agent

main d7650e4 companion-recovery-p... d3d2eee +/-
66% 66% 0%

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.

@BunsDev

BunsDev commented Nov 10, 2026

Copy link
Copy Markdown
Contributor Author

Independent overnight audit (2026-11-10) confirms this exact signed head d3d2eee085ef101e9e044bb7502444518a5d982d, tree aa4bd344a9fce749c459054dda72ab948ce33e04, remains based on current main d7650e4c54cdd15e4ee4f14b9f4dec3455ba1e77. Both commit signatures and all nine candidate file hashes verify; current-head macOS, iPhone and analysis checks remain successful. Existing build/typecheck, 2,327 unit/coverage passes (26 skips), 63 native unit passes, 505 desktop E2E passes (four live-provider skips) and seven site passes are bound to the unchanged inputs. All four retained hosted artifact ZIP hashes independently match live GitHub digests.

Two additional complete paired suites passed consecutively on separately created iPhone Duo simulators using iOS 27.2 (24B91016s), Xcode 27.2 (27B52), Node 24.22.0 and pinned pnpm 10.34.5. Each preinstall app inventory proves Modex was absent. Each finalized XCTest bundle reports 44 executions: 43 ordinary passes, one existing intentional expected-failure screenshot self-test, zero unexpected failures and zero skips. Both the fresh-project-context and full paired workflow tests have status Success in both bundles. Pairing, actual project/provider discovery, one exact skill insertion, explicit thread creation, approval/follow-up, relaunch recovery, native secret questions and Mac-winner/Stop closure all remain covered. Source and documentation hashes stayed unchanged; no retry or new product edit was needed. Timeout and retained-draft screenshots were inspected.

The two #495 symptoms remain distinct: the first attempt never reached its paired thread; the retry paired and then missed the skill. The related recorded command GET timeout proves a destructive root-alert presentation with the correct project selected; the failing-first regression and scoped-picker repair address that demonstrated defect. Separate native reproductions support the keyboard Done fix. Neither proves a common historical cause for both #495 failures or the trigger of every transport timeout. PR #496's reset remains excluded because its independent context regression passes without it.

Both new simulator boot logs reported Data Migration Failed despite bootstatus returning zero; these startup warnings are retained alongside the actual passing suites. The original first failures, expected screenshot self-test, superseded CI cancellation and unrelated three-pixel Code Review diagnostic remain preserved. No test assertion/deadline was weakened. The original dirty companion-skill-flow worktree and released delivery worktree remain untouched, with original file/diff hashes checked. Coordination with their owner confirmed no newer work and no ownership objection to this independent audit.

Prepared for review under the current overnight goal. #276/#281 human, deferred VoiceOver, physical-device and live-provider acceptance remain open. No merge, release, TestFlight upload, feature-default change or other owner's cleanup occurred. The candidate review and checkpoint remain the source receipt; this audit adds the two fresh-install bundles and current-state verification.

@BunsDev
BunsDev marked this pull request as ready for review November 10, 2026 10:33
@BunsDev
BunsDev added this pull request to the merge queue Nov 11, 2026
Any commits made after this event will not be merged.
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 11, 2026
@BunsDev

BunsDev commented Nov 11, 2026

Copy link
Copy Markdown
Contributor Author

The first protected queue attempt failed in required macOS job 130429605681 on queue candidate 4ba71bc4677876d72df2c14697c9254466a6db6f (tree aa4bd344a9fce749c459054dda72ab948ce33e04, identical to the reviewed PR head). Build and units passed; desktop E2E finished with 504 passes, four skips, and one failed Code Review rollback/relaunch case, plus a worker teardown timeout. The site stage did not run. After relaunch, the Settings click stalled while performing the click; teardown then timed out. The transcript budget passed at a 150.5 ms cold-open median, so this is not a budget-gate failure.

The PR was removed from the queue and remains unmerged. The original logs, trace and complete E2E artifact are retained. I am reproducing the unchanged queue source with the original deadlines before choosing a repair or requeue. No Code Review cause or repair is established by this failure.

@BunsDev
BunsDev added this pull request to the merge queue Nov 11, 2026
Any commits made after this event will not be merged.
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 11, 2026
@BunsDev

BunsDev commented Nov 11, 2026

Copy link
Copy Markdown
Contributor Author

The second merge-queue attempt, run 42999781244 on candidate 5c26e189b4b4aefcf8462fd644025ec5f9cd8aa6 (tree aa4bd344a9fce749c459054dda72ab948ce33e04), was cancelled without merging. Build and units passed. Desktop E2E reached a different failure: store-desktop.spec.ts’s Settings protocol-recovery case timed out, followed by a 90-second worker-teardown timeout; the job then reached its 45-minute limit. Site E2E did not run.

The retained trace shows that this case passed its recovery, keyboard, settings, draft and saved-access assertions, then stalled in client.close() in its finally block. That locates the observed stall; it does not establish its cause or prove a repair. The original first-attempt Code Review failure, this run’s logs and the uploaded E2E trace are retained separately. I am investigating before any further queue entry; PR #496 remains open pending actual protected delivery of the independent context regression.

@BunsDev
BunsDev added this pull request to the merge queue Nov 11, 2026
Any commits made after this event will not be merged.

This branch was successfully deployed

1 active deployment
Preview — d3d2eee0 Deployed Nov 8, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant