Conversation
…n always renders Surface: the mobile app (apps/mobile). The profile screen can finish loading with no account section at all. apps/mobile/src/components/profile-screen.tsx gates the trpc.user.getAuthProviders and organizations.list queries on useAfterInteractions(). Under an automated UI session InteractionManager sometimes never reports idle, so those queries never start and the Linked accounts row -- the only place the app renders the signed-in email address -- never appears. The screen looks loaded and is missing its identity. Evidence: of 27 passing sign-in probes, 27 had the account row on the first screen dump; of 40 failing ones, 0 had it after four dumps. That is 40 occurrences in one day. Fix it so the account section cannot be lost this way: either give useAfterInteractions a timeout fallback that resolves anyway, or do not gate the account queries on interactions at all. Whichever you choose, say why the other is worse. Prove it with the account row rendered on a cold open of the profile screen, and with a second capture showing it still renders when interactions never report idle -- force that state in the worktree to capture it, then revert the forcing before you finish.
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental changes since the previous review extract the Profile screen's Android destructive-confirm platform check into Files Reviewed (6 changed files)
Unchanged since the previous review and re-verified: Previous Review Summary (commit 9a81b7d)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 9a81b7d)Status: No Issues Found | Recommendation: Merge Executive SummaryThe bounded-fallback fix in Files Reviewed (5 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
|
This description names a scenario the proof did not capture:
A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision. |
eshurakov
left a comment
There was a problem hiding this comment.
Approved after a shallow triage pass. No blocking findings.
|
The merge bot leaves this one to a human: Jev reads it as a human's merge (confidence 0.83). |
Changelog for users
Changelog for maintainers
useAfterInteractionsreports resolved after at most 500 ms (AFTER_INTERACTIONS_FALLBACK_MS), so work gated on it can no longer wait forever.settledguard plus cleanup of the interaction handle and fallback timer prevent state updates after unmount or a late interaction callback.E2E proof
[e2] Force the never-idle state in the worktree (make InteractionManager.runAfterInteractions in apps/mobile/src/lib/hooks/use-after-interactions.ts never invoke its callback, e.g. — android emulator-5554: with the staged never-idle hook live, a cold open of Profile gives 'SCENE e2 OK' with LINKED ACCOUNTS tappable [55,1061][1025,1105] and e2e-mobile-req-20260920-025104-f692-android@example.com tappable [189,1211][998,1248] (the 500 ms AFTER_INTERACTIONS_FALLBACK_MS bound releases them); the same forced state without the fallback leaves those rows absent in e2-control-baseline.txt (header at bounds [55,1233][1025,1277], no Email/address node); the forcing was reverted with git checkout and git status --porcelain plus git diff --stat are empty.
E2E proof — log excerpts
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260920-025104-f692/e2e-mobile-app/scripted-e1.log/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260920-025104-f692/e2e-mobile-app/e2-forced-never-idle.log/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260920-025104-f692/e2e-mobile-app/e2-control-baseline.txtOwner request
Follow-ups (not changed here)