Read-only revalidation · no Jira changes made

jira & branch revalidation

Every non-Epic ANDROID ticket, cross-checked against live Jira status and a read-only code review of its fix branch versus the current main. Generated 19 Jun 2026.

84
tickets revalidated
17
ready to merge
clean vs main
26
conflict with main
need rebase
29
no branch
6 need work · 6 in main

Key findings

  • The fix branches were cut before the dev's 211-commit push to main, so 26 now conflict (main independently rewrote the same files). Only 17 merge cleanly.
  • Some fixes were merged then reverted/regressed on main: ANDROID-9 (backdrop), ANDROID-10 (tab insets), ANDROID-11 (offers TTL). The bug is effectively back despite the ticket status.
  • Only 4 tickets carry an actual QA sign-off comment; many marked "QA Verified" have no QA note on the issue.
  • Clean merge-candidate set: ANDROID-24, ANDROID-25, ANDROID-26, ANDROID-27, ANDROID-34, ANDROID-38, ANDROID-42, ANDROID-44, ANDROID-46, ANDROID-48, ANDROID-50, ANDROID-55, ANDROID-56, ANDROID-57, ANDROID-58, ANDROID-64, ANDROID-67.
TicketSummary / branchJira statusQAVerdict / churnReview & merge notes
ANDROID-9 ANDROID-9 (bottom-sheet backdrop tap-swallowing on dev build). Jira: Done, resolution Done, assignee Vineet Kumar; QA-verified on emulator by the author. Fix branch 4cb3229 was merged to main via PR #1, so it is an ancestor of main (no diff, no conflicts). However the fix has been REVERTED in current main by a later commit (8f8f9ce by Mohammed Elhatmi) which restored disappearsOnIndex={-1}, dropped enableTouchThrough, and the Object.freeze dev override is back -- so the bug is effectively reintroduced on main. Marked already-in-main by ancestry, but flagged: the actual code fix is no longer live and should be re-applied.
fix/android-9-devbuild-freeze-crash
Done
Vineet Kumar
QA verified already in main
3 files · +32/−15
review & merge notes
Risk: Root cause is sound and the fix is correct: Reanimated 4 + New Arch leaves a closed @gorhom bottom-sheet's animatedIndex at ~-0.99999996, so BottomSheetBackdrop's `animatedIndex <= disappearsOnIndex(-1)` check is false and a closed sheet keeps an invisible full-screen backdrop with pointerEvents=auto that swallows all taps. The branch fixes it (disappearsOnIndex -1 -> -0.5, enableTouchThrough=true in both duplicate bottomSheetDefaults copies) and removes the ineffective dev-only Object.freeze=noop override. Low risk: opacity interpolation keeps the backdrop transparent below -0.5 so no visual change. Branch was QA-verified on emulator by the author. CRITICAL REGRESSION: although the branch was merged to main via PR #1 (merge b230a37, 2026-06-17), two LATER commits by Mohammed Elhatmi reverted the fix in main's current tree -- 8f8f9ce (2026-06-18) reset disappearsOnIndex back to {-1} and dropped enableTouchThrough in features/common/bottom-sheet/bottomSheetDefaults.tsx (and the shared/ copy), and the Object.freeze dev override is back in app/_layout.tsx. So the QA blocker is currently UN-fixed on main despite the ticket being Done.
Merge: Branch tip 4cb3229 is an ancestor of origin/main (merged via PR #1 / merge commit b230a37), so diff/log/cherry vs main are empty and there are no conflicts. BUT the fix was subsequently REVERTED on main by commit 8f8f9ce (Mohammed Elhatmi, 2026-06-18 02:05) which restored disappearsOnIndex={-1} and removed enableTouchThrough in both bottomSheetDefaults.tsx copies; the Object.freeze=noop override is also present again in app/_layout.tsx (current main). Action: do NOT re-merge the branch (it is an ancestor and would be a no-op). Instead re-apply the fix on top of current main / revert 8f8f9ce, since the actual bottom-sheet backdrop fix is no longer present in main and the QA blocker stands. Confirm with the team whether the revert was intentional (Mohammed had argued the Object.freeze override sufficed; Vineet disagreed and intended to merge the float-tolerant fix).
Vineet Kumar · 2026-06-18Vineet: replying to Mohammed, says he'll merge the suggested changes; the Object.freeze=noop override cannot suppress that error and is ineffective. (Prior: Mohammed claimed it was already fixed by the Object.freeze override and prod was never at risk, suggested dismissing.) First comment: Vineet's auto-fix with full live-emulator QA verification.
ANDROID-10 ANDROID-10 (edge-to-edge tab bar insets) is marked QA Verified with no QA sign-off comment, and the fix it relies on has REGRESSED off main. The prescribed inset fix shipped in commit 768f553 (still in main's ancestry), but a later 211-commit dev push (HEAD 95b19e7) overwrote app/main/(tabs)/_layout.tsx, replacing the inset-aware tabBarStyle with a bare {backgroundColor:"white"}. No branch exists.
QA Verified
Preji John
no QA note needs work
review & merge notes
Risk: Regression on main: app/main/(tabs)/_layout.tsx currently has only tabBarStyle={{ backgroundColor: "white" }} (line 142) and no longer imports/uses useSafeAreaInsets. The correct fix from 768f553 (paddingTop:12, paddingBottom:insets.bottom, minHeight:60+insets.bottom) was clobbered by the dev main push. On Android 15 gesture-nav devices the tab bar can again be obscured by the system nav area — the exact P2 bug this ticket describes. Root SafeAreaProvider (app/_layout.tsx) and app/index.tsx top insets are intact, but the tab bar bottom-inset handling — the core deliverable — is missing. The QA Verified status is not backed by any QA pass comment; assignee Preji John was asked to verify on 06-18 but has not responded.
Merge: No branch to merge. The fix must be RE-APPLIED to main: restore the inset-aware tabBarStyle in app/main/(tabs)/_layout.tsx (re-add useSafeAreaInsets import + const insets, set tabBarStyle to { paddingTop:12, paddingBottom: insets.bottom, minHeight: 60 + insets.bottom }) as it existed in commit 768f553. This is part of the "launch-critical patches" family that the 211-commit dev push regressed (cf. HEAD 95b19e7 "re-apply 7 launch-critical patches"); ANDROID-10's tab-bar inset patch was apparently not among the 7 re-applied. Do NOT close as QA Verified until re-applied and re-verified on an Android 15 emulator.
Vineet Kumar · 2026-06-18Vineet mentioned @Preji John "Verify this issue." No reply/confirmation from Preji John recorded. Prior comments (2026-06-12): an auto-fix comment by Vineet claiming the prescribed inset fix was already on main via commit 768f553 with live emulator verification, and Mohammed Elhatmi commenting "Already fixed."
ANDROID-11 The TTL-cache fix was reverted. The branch tip (07e7cd8) is now an ancestor of origin/main (0 commits ahead, 210 behind); diff --stat, log, and cherry are all empty. The would-be TTL change (useFocusEffect import + lastFetchedAtRef 60s guard) exists nowhere in the repo — main's useOffersData.ts uses silentRefresh() on visitCount change instead. The ticket is an unresolved design dispute escalated to Subin, not a mergeable branch.
fix/android-11-offers-ttl-cache
In Review
Preji John
QA rejected already in main
0 files · +0/−0
review & merge notes
Risk: No code to merge: branch carries zero commits ahead of main and its file is byte-identical to main (the pre-TTL version with silentRefresh on visitCount). The TTL guard described in Vineet's "fixed-unverified" comment is not present on the branch ref. Substantively the change is contested: Mohammed (assignee's reviewer/dev) reverted it, arguing the 60s in-memory TTL is a deliberate divergence from iOS — iOS has no cache and refetches on every viewWillAppear, and main's existing silentRefresh-on-visitCount already avoids skeleton flashes while staying closer to iOS parity. Both parties agree the optimization is technically sound; the open question is purely whether to diverge from iOS, now pending Subin's call (cross-ref ANDROID-80). No QA verification; resolution is null; status In Review.
Merge: Nothing to merge — branch is fully behind main (ancestor tip, 0 ahead/210 behind) and the TTL work has been reverted, so the fix is effectively gone. Do NOT treat as ready. This is a blocked design decision: the original TTL approach was endorsed by Vineet but reverted by Mohammed and escalated to Subin (Subin Kurian) over iOS-parity vs optimization, with ANDROID-80 linked. Resolve the parity decision with Subin first; if TTL is approved the commit must be re-created/re-pushed (it is not on the branch). qaSignal=rejected reflects the reviewer revert/reopen, not a formal QA pass.
Mohammed Elhatmi · 2026-06-18Mohammed posted a link to ANDROID-80 (his prior comment same day: "I reverted this" — the 60s TTL is a deliberate divergence from iOS, which has zero caching and refetches on every viewWillAppear; says current silentRefresh on visitCount is closer to iOS, and React Query would make parity worse. Asks to confirm with Subin before diverging.)
ANDROID-12 Branch deletes the no-op offersStore.tsx re-export stub and re-points its 3 importers (app/_layout.tsx, app/profile/personal-details.tsx, features/auth/guards/AuthGuardOptimized.tsx) plus the features/offers/index.ts barrel to import directly from @core/providers/StoreProvider. The change is correct and low-risk but will NOT merge cleanly: features/offers/index.ts has diverged on main, producing a content conflict.
fix/android-12-remove-dup-storeprovider
To Do
Mohammed Elhatmi
no QA note conflicts
5 files · +5/−8
review & merge notes
Risk: Change itself is correct and low risk: offersStore.tsx is a verified byte-for-byte re-export stub of @core/providers/StoreProvider, so re-pointing importers is behavior-preserving. The branch covers only the StoreProvider portion of the ticket, but the other two items (dead home Calendar/Deliverables/CalendarBottomSheet components and the unused proceedWithAcceptedInvitations endpoint) are already absent from main, so scope is effectively complete. The branch work is NOT yet in main: offersStore.tsx still exists on main and all 3 importers still reference the stub path. Risk is the merge conflict, not the logic.
Merge: Conflicts with main on features/offers/index.ts — the barrel has been edited on main since the branch point (the offersStore export moved from line 56 at the merge-base to line 27 on main), so the branch's edit to that same export line collides. git merge-tree reports CONFLICT (content) in features/offers/index.ts; the other 4 files auto-merge cleanly. Resolution is trivial: rebase the branch onto current origin/main and re-apply the single barrel-export change (export * from "@core/providers/StoreProvider" instead of ./store/offersStore), then delete the stub. Note Mohammed commented "Already done" but the cleanup is verifiably still pending in main.
Vineet Kumar · 2026-06-18Vineet (2026-06-18): "I still see the same files and other in main branch, let me know if you are pushing the code changes otherwise I'll proceed with merge." Prior: Mohammed Elhatmi (2026-06-12) "Already done." No QA review.
ANDROID-13 Single-commit fix branch (06acea9) touching shared/components/feedback/AnimatedSplashScreen.tsx and app/index.tsx to decouple time-to-interactive from splash/landing video. The branch implementation is internally sound: splash finishes on auth-ready instead of waiting for playToEnd, adds a 6s failsafe, two-phase VideoView detach to avoid the expo-video released-shared-object crash, hides native splash on first layout, and refactors index.tsx so the 38MB landing-video player only mounts when the landing actually shows. However it does NOT merge cleanly: main has since received an independent, more advanced rework of both exact files (commits f6dee20 and 1909e6f) introducing a shared splashState coordination util, Redirect, reactive auth-store subscription, prefetch refactor, AppState resume handling, and its own released-shared-object fix. merge-tree --write-tree reports CONFLICT on both files. Notably main's splash STILL gates finish on isAppReady && hasVideoCompleted (kept deliberately to match iOS, per the dev), so the branch's central "don't wait for playToEnd" decoupling was NOT adopted on main. Ticket is To Do, unresolved; Vineet's 06-18 comment reopened it for two follow-ups (intermittent first-splash load failure; landing should show sign up/in form immediately). No QA verification present.
fix/android-13-decouple-splash-video
To Do
Mohammed Elhatmi
no QA note conflicts
2 files · +122/−83
review & merge notes
Risk: Branch code itself is reasonable and low-risk in isolation, but it is now stale relative to main. Main re-architected both files with a different approach (splashState handshake, reactive auth subscription, Redirect-based navigation, AppState handling). The two designs diverge on the core question: branch removes the playToEnd gate; main intentionally keeps it (matching iOS). Mechanically applying the branch would regress main's newer coordination logic and the SurfaceView-bleed-through fix. The first-splash-load and immediate-form requirements raised by Vineet on 06-18 are not fully addressed by either side and remain open.
Merge: Do NOT merge this branch as-is — conflicts with main on both app/index.tsx and shared/components/feedback/AnimatedSplashScreen.tsx, which main has already reworked (commits 1909e6f, f6dee20) using a more advanced architecture. The fix is partially superseded by the dev's main-branch work, but the central decoupling (finish-on-auth-ready, don't wait for playToEnd) was deliberately NOT taken on main. Resolve at the design level with Mohammed/Vineet first: decide whether to keep the iOS-matching playToEnd gate or adopt the auth-driven finish, then port only the still-wanted pieces (immediate sign up/in form fade-in, landing player not mounting on home redirect, intermittent first-splash fix) on top of main's current code. Treat the branch as a reference, not a mergeable changeset.
Vineet Kumar · 2026-06-18Vineet acknowledges dev's "intentional/already fixed" reply but reports the first splash sometimes fails to load and the second (landing) splash should show the sign up/in form immediately rather than waiting for the video to play out. Explicitly moves the ticket back to TO DO pending dev response. Prior comment (Mohammed, 06-12): part is intentional to match iOS, second part already fixed.
ANDROID-14 ANDROID-14 (Task, To Do) asks for a conscious EAS Update strategy decision plus pruning duplicate EAS profiles and adding an eas.json submit block. No fix branch exists; the only comment is an auto-fix pipeline triage explicitly marking it BLOCKED and scoped out as requiring a human release-engineering decision.
To Do
Vineet Kumar
no QA note no branch
review & merge notes
Risk: No code has been written — nothing to assess for correctness. The work is genuinely a human decision, not a mechanical fix: it requires deciding whether to adopt expo-updates/runtimeVersion/production channel for OTA hotfixes vs documenting resubmission-only, plus knowing which of the 6 near-identical EAS profiles (preview2/3/4 etc.) QA actually depends on before pruning. Blindly pruning profiles or editing eas.json risks breaking current team/QA builds. Adding an eas.json submit block also needs an Android service account and Play track config (external credentials/access). Ticket is correctly parked in To Do.
Merge: No branch — nothing to merge. Cannot proceed via auto-fix; needs a human owner to make the EAS Update strategy decision, confirm which QA profile to keep, and supply Play service-account credentials before any eas.json/app.json/package.json change. Touches eas.json/app.json — coordinate with any other release-config tickets to avoid overlapping edits.
Vineet Kumar · 2026-06-12Auto-fix triage — BLOCKED (needs human). EAS Update channel strategy + profile pruning is a release-engineering decision (which profiles QA depends on is unknown); auto-changing eas.json could break team builds. Scoped out by auto-fix pipeline 2026-06-12 (needs human decision/access).
ANDROID-15 ANDROID-15 asks to remove 4 dead native deps (expo-av, expo-blur, expo-symbols, react-native-swiper) from package.json. All four are ALREADY removed from origin/main as part of a broader dependency cleanup the dev landed there. The fix branch (1 commit, package.json only, -4 lines) is therefore redundant. The branch is 211 commits behind main and merge-tree reports a CONFLICT in package.json, but the ticket's actual objective is already satisfied in main.
fix/android-15-remove-dead-deps
To Do
Mohammed Elhatmi
no QA note already in main
1 files · +0/−4
review & merge notes
Risk: The branch's only change is deleting the 4 dependency lines from package.json (0 additions, 4 deletions, 1 commit d1b8a03). I confirmed git grep over origin/main source finds zero imports of any of the 4 packages, and git show origin/main:package.json shows NONE of the 4 are present — they were already deleted in main. So the change is correct in intent but no longer needed: main already accomplishes the ticket goal (and went further, also dropping picker, country-flag-icons, expo-haptics, navigation deps, etc.). No correctness risk; the work is simply superseded. async-storage was correctly retained per the description.
Merge: Do NOT merge this branch. The fix is superseded — origin/main already has all 4 dead deps removed (verified absent in origin/main:package.json), so the objective is complete in main. The branch is 211 commits behind and merge-tree shows a CONFLICT in package.json purely because both main and the branch edited overlapping dependency regions; resolving it would yield no net change. Recommend closing/abandoning the branch and moving the ticket toward Done as already-implemented-in-main (Mohammed's "Already done" / "duplicate" comments are consistent). If anyone still wants a verification gate, it's a fresh EAS build smoke-test, not a code merge.
Mohammed Elhatmi · 2026-06-18Mohammed: the reported issue is being reported/tested by Preji under ANDROID-79; last build shouldn't have this issue. "duplicate". (Earlier: Vineet said he sees no code push and only mark In Review when code is in main; Mohammed had said "Already done".)
ANDROID-16 ANDROID-16 removes FlashList v1-only props from OffersList, history, and notifications to complete the v2 migration. The branch (1 commit, 4b003b7) is correct in intent, but main diverged after the branch's base: commit 162874e (Mohammed, 2026-06-18) heavily refactored OffersList.tsx, editing the same FlashList block. merge-tree reports a content CONFLICT in OffersList.tsx. history.tsx and notifications.tsx also got newer main commits but auto-merge cleanly. Notably, main's refactor already dropped most v1 props (overrideItemLayout, estimatedListSize, removeClippedSubviews, maxToRenderPerBatch, updateCellsBatchingPeriod, windowSize) as a side effect, leaving only estimatedItemSize={200} still present on main. Jira: In Review, Unassigned, no resolution, no QA.
fix/android-16-flashlist-v2-props
In Review
Unassigned
no QA note conflicts
3 files · +2/−20
review & merge notes
Risk: Branch change is technically sound and low-risk in isolation: it removes props FlashList v2 ignores at runtime and migrates the ref type (FlashList->FlashListRef) and overrideItemLayout to the v2 signature (layout.span vs layout.size). However it does NOT merge cleanly. Main's commit 162874e rewrote the OffersList FlashList block and surrounding component (removed profileData/displayedCount/totalCount props, perf monitoring, render handlers) so both sides edited overlapping lines -> real content conflict. Main also still carries estimatedItemSize={200} and a stale FlashList<any> ref type, so the v2 migration is genuinely incomplete on main; the fix is still needed. QA never ran (low-end Android scroll perf check requested in ticket was not performed; comment is fixed-unverified).
Merge: Conflicts with origin/main in features/home/components/OffersList.tsx due to dev commit 162874e (Mohammed) which refactored the same FlashList block. Must be reconciled by hand against the current main version, not auto-merged. The branch's git diff is stale: main already removed most v1 props during its refactor, so the only remaining v2 cleanup on main is estimatedItemSize={200} plus the FlashList<any> -> FlashListRef<any> ref-type change. Re-create the fix on top of current main (estimatedItemSize removal + FlashListRef import/ref type) rather than merging this branch. history.tsx and notifications.tsx auto-merge cleanly (their estimatedItemSize removals still apply). Recommend re-basing branch on main, dropping now-redundant OffersList prop deletions, and running the low-end-device scroll QA before review sign-off.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added FlashListRef import, switched ref type to FlashListRef, removed v1-only props (estimatedItemSize, estimatedListSize, removeClippedSubviews, maxToRenderPerBatch, updateCellsBatchingPeriod, windowSize), fixed overrideItemLayout to v2 layout.span. Static-only verification: TS errors 133->128, no new errors. Branch 4b003b7. No QA performed.
ANDROID-17 ANDROID-17 fix is substantively already in main (type consolidation + code_id + onSkip done by dev); branch conflicts and is superseded except for the missing typecheck npm script.
fix/android-17-userprofile-types-typecheck
In Review
Unassigned
no QA note conflicts
11 files · +17/−108
review & merge notes
Risk: The branch's substantive fix is already implemented on main independently by the dev, so it does NOT merge cleanly. merge-tree reports CONFLICT on 6 files (features/profile/types/profile.ts, features/profile/index.ts, app/profile/niches.tsx, features/auth/utils/userVerification.ts, features/profile/hooks/useInfluencerTypes.ts, features/profile/utils/profileUtils.ts, shared/components/feedback/ErrorState.tsx). Verified main already has: features/profile/types/profile.ts as a re-export of the canonical types/profile.ts (consolidation done); code_id present in constants/Types.ts (line 443: code_id?: string|number|null); onSkip + canSkipInvitation on InviteFriendsBottomSheetProps. The only branch delta main lacks is the package.json "typecheck":"tsc --noEmit" script. The branch commit b96ec68 is not in main (cherry: +). The branch also does the @types/profile -> @/types/profile import rename which conflicts with main's @features/profile import style. Mohammed Elhatmi confirms "Already done". Low correctness risk in the code itself, but merging the branch as-is would conflict and largely re-do existing work.
Merge: Do NOT merge this branch as-is: conflicts on 7 type/import files because main already consolidated UserProfile and added code_id/onSkip independently. The branch is effectively superseded by the dev's work on main; "Already done" per Mohammed Elhatmi. Only genuinely missing piece is the package.json "typecheck":"tsc --noEmit" script — cherry-pick just that one-line addition (and optionally wire it into CI/pre-build) rather than merging the whole branch. Close/abandon the branch otherwise.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "Already done." (Prior comment was Vineet Kumar's auto-fix attempt: tsc 133->116, consolidated UserProfile, added code_id/onSkip, added typecheck script, commit b96ec68.)
ANDROID-18 Branch re-encodes only the 38MB intro video (assets/video/alist.mp4) via a Git LFS pointer swap, 40,026,729 to 3,207,115 bytes (-92%). The PNG flag set (the second half of the ticket) was NOT touched and was explicitly deferred. Merges cleanly into main, but the human reviewer rejected the approach.
fix/android-18-shrink-intro-video
Done
Unassigned
QA rejected needs work
1 files · +2/−2
review & merge notes
Risk: Technically the change is minimal and clean: a single Git LFS pointer update for alist.mp4 (38.2MB to 3.1MB), no code/require() changes, file path unchanged, merges with no conflict. However the scope is incomplete - only the video half of the ticket was done; the 12MB PNG flag set was left untouched (deferred to a follow-up). More importantly, reviewer Mohammed Elhatmi rejected the fix on quality grounds (compression "guaranteed to lower the quality by a significant margin, not advised") and stated the PNG-over-SVG flag choice was intentional to match iOS. The crf-28 re-encode quality claim rests only on emulator screenshots from the auto-fix bot, with no human sign-off on visual fidelity.
Merge: Clean merge into main, no conflicts (merge-tree wrote a tree with no CONFLICT markers). Do NOT merge as-is: the reviewer rejected the compression on visual-quality grounds and considers the flag change unwanted (PNGs intentionally match iOS). Resolve the quality objection with the team (e.g. agree a target bitrate/CRF and get a real-device visual review) before merging. Ticket is marked Done on the board but with Unassigned owner and a rejecting last comment - the Done status appears premature.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi rejected the fix: video compression is guaranteed to significantly lower quality and is not advised; the SVG flags were intentionally replaced with PNGs to match iOS; dead code already deleted; "No changes needed here." This overrides the bot's earlier QA-verified-on-emulator claim.
ANDROID-19 Branch adds non-throwing console.warn instrumentation to silent catch blocks. authStore/session/storage changes are correct and merge clean, but the index.tsx hunk conflicts with and is obsoleted by main commit 1909e6f which rewrote index.tsx and moved auth-bootstrap out. Needs rebase and re-targeting of the auth-bootstrap catch; no QA sign-off.
fix/android-19-instrument-silent-catches
In Review
Unassigned
no QA note conflicts
4 files · +21/−10
review & merge notes
Risk: Instrumentation itself is correct and low-risk: each change adds a non-throwing console.warn(e) inside existing empty catch bodies (authStore.logout x5, session.ts 401 nav+logout, storage.ts saveToken+clearAllAuthData, index.tsx auth-bootstrap), leaving runtime behaviour unchanged. But the branch is stale against main on app/index.tsx: dev commit 1909e6f ("Add/update app/index.tsx", Mohammed, Jun 18) rewrote index.tsx (-70/+35) and moved the auth-bootstrap/initializeAuth logic out of the file ("AnimatedSplashScreen owns initializeAuth()"). The catch the branch instruments at index.tsx:~109 no longer exists in main, so that hunk is both conflicting and obsolete; the highest-risk auth-bootstrap path is therefore NOT covered as-is. Ticket also lists request.ts in-scope; branch left it untouched (defensible but partial). No QA verification; assignee Unassigned, resolution unset, still In Review.
Merge: Does NOT merge cleanly. git merge-tree reports CONFLICT (content) in app/index.tsx vs origin/main; authStore.ts, session.ts, storage.ts auto-merge clean. Root cause: main commit 1909e6f rewrote index.tsx and relocated auth-bootstrap logic, making the branch's index.tsx hunk stale. Action: drop/rebase the index.tsx hunk and re-instrument the auth-bootstrap catch where initializeAuth now lives (AnimatedSplashScreen); the remaining 3-file instrumentation then lands cleanly. Optionally instrument request.ts to fully satisfy ticket scope. Needs rebase + re-target before merge.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added non-throwing console.warn logging to the 5 highest-risk silent catch blocks (auth-bootstrap, 5x logout, 401 nav/logout, storage saveToken/clearAllAuthData). request.ts parse catches left as-is. Static-only: tsc unchanged at 133 errors, eslint zero new. Sentry (ANDROID-60) is the real long-term fix; ANDROID-62 strips console.* in release.
ANDROID-20 Single-commit branch (1de8807) that wires up the dead errorLogger and ErrorLogsViewer: makes Profile/Offers componentDidCatch call logError, adds an Expo Router root ErrorBoundary in app/_layout.tsx, and hardens errorLogger for the SecureStore ~2KB limit. However, main has since taken the opposite (also ticket-sanctioned) path: it DELETED errorLogger.ts, the duplicate shared ProfileErrorBoundary, and removed componentDidCatch from features ProfileErrorBoundary. The branch is therefore stale and superseded, and will not merge.
fix/android-20-wire-errorlogger
In Review
Unassigned
no QA note conflicts
5 files · +127/−10
review & merge notes
Risk: Code quality of the branch itself is reasonable: componentDidCatch wiring is correct, the root ErrorBoundary logs once per error via useEffect([error]) (no recursion/loop), ErrorLogsViewer is gated behind __DEV__ so logs are never exposed to end users, and the errorLogger truncation hardening (800-char fields, MAX_LOGS 20, fallback 5) sensibly addresses the SecureStore ~2KB concern. BUT it is functionally obsolete: main deleted shared/utils/errorLogger.ts and shared/components/profile/ProfileErrorBoundary.tsx entirely and stripped componentDidCatch from features/profile/components/ProfileErrorBoundary.tsx. Merging this branch would resurrect deleted modules (errorLogger, ErrorLogsViewer) and re-introduce imports of them in app/_layout.tsx, directly contradicting the dev's chosen delete-based resolution. The ticket explicitly allowed EITHER deleting errorLogger/ErrorLogsViewer OR repurposing logError; the dev picked delete, the branch picked repurpose. Verification was static-only (tsc 133->133, eslint clean); no QA sign-off.
Merge: Do NOT merge as-is. merge-tree reports 4 conflicts: content conflicts in app/_layout.tsx and features/profile/components/ProfileErrorBoundary.tsx, plus two modify/delete conflicts where main DELETED shared/utils/errorLogger.ts and shared/components/profile/ProfileErrorBoundary.tsx that this branch modifies. The branch is superseded by the dev's delete-based resolution on main (errorLogger/ErrorLogsViewer removed, componentDidCatch dropped). Recommend abandoning the branch unless the team decides to reverse course and reintroduce a local error sink. If kept, it must be rebuilt from scratch on current main: errorLogger and ErrorLogsViewer no longer exist, so a fresh approach (e.g. wiring boundaries to Sentry once S0 lands) is the appropriate direction.
Vineet Kumar · 2026-06-12Auto-fix attempt (commit 1de8807): wired ProfileErrorBoundary/Offers ErrorBoundary componentDidCatch to logError, added Expo Router root ErrorBoundary in app/_layout.tsx that records via logError and exposes ErrorLogsViewer in __DEV__ only, and hardened errorLogger (MAX_LOGS 100->20, field truncation 800 chars, fallback 50->5). Sentry forwarding + boundary consolidation deferred until S0. Static checks only (tsc 133->133, eslint clean); no runtime/QA verification.
ANDROID-21 ANDROID-21 (Wire Intercom Identity Verification userHash/HMAC) is in To Do, Unassigned, unresolved, with no fix branch. Both comments are triage notes flagging it as backend-scoped and BLOCKED for the client; no implementation or QA has occurred.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: Genuine P1 security gap: intercom.ts supports a userHash but intercomLoginIdentified is called with only {id,email}, never an HMAC. Without server-side Identity Verification, anyone knowing a user's id/email could impersonate them in Intercom and read support history — PII/brand-deal exposure. However, the fix is fundamentally backend-dependent: the backend must expose an HMAC-SHA256 userHash endpoint before any client wiring is meaningful. Shipping client-side changes alone without the backend endpoint would be useless and could lock users out of the messenger. No code exists yet.
Merge: Nothing to merge — no branch and no commits. Blocked on backend work (HMAC userHash endpoint) per both triage comments; out of alist-android/React Native scope. Either an explicit launch-risk acceptance or backend delivery is required before client wiring in shared/utils/intercom.ts and core/state/authStore.ts:65 can proceed. Not a merge candidate for the Android launch.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi (2026-06-12): "This is out of React native code scope." Prior comment by Vineet Kumar (2026-06-12) auto-fix triage marked BLOCKED (needs human): backend must implement the Intercom Identity Verification HMAC (userHash) endpoint; client wiring alone is useless and could lock users out of the messenger. Scoped out of the auto-fix pipeline as it needs backend/console access or a human decision.
ANDROID-22 ANDROID-22 (P1 tech-debt) replaces fragile FCM-based JWT refresh and the fake device-token generator. Live Jira: status "To Do", Unassigned, no resolution. No fix branch exists. Sole comment (Vineet Kumar, 2026-06-12) marks it BLOCKED pending a backend refresh-token contract; scoped out of the auto-fix pipeline.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: No code work done; nothing to assess for correctness. The ticket itself describes real launch risk: tokenRefresh.ts couples JWT refresh to the /user/fcm_token notifications endpoint, generateTestFCMToken registers a fake 152-char token that silently breaks real push, shouldRefreshToken() always returns false so proactive refresh never runs, and a refresh 401 races clearToken(). These remain unaddressed. Fix is correctly blocked on a backend refresh contract (alist-portal); a frontend-only fix would break session renewal.
Merge: No branch to merge. Blocked: requires backend to confirm/define the sanctioned refresh endpoint before any android-side work can start. Not actionable for the launch merge train until the backend contract lands and a human picks it up.
Vineet Kumar · 2026-06-12Auto-fix triage marked BLOCKED (needs human): replacing FCM-based token refresh requires a real refresh-token contract from the backend (alist-portal). A frontend-only change would break session renewal. Scoped out of the auto-fix pipeline (alist-android only); needs backend/human decision.
ANDROID-23 ANDROID-23 branch migrates pre-auth OTP endpoints (auth.ts) and two offer redemption endpoints (fetchOffer, verifyVenueCode) onto the shared request.ts wrapper, adding a well-designed skipAuth option to request.ts for pre-auth/anonymous calls. The request.ts and auth.ts changes are sound and merge cleanly. However, main has independently diverged on features/offers/api/offer.ts: a dev solved the same problem differently by introducing getTokenOrLogout() from @shared/utils/session and keeping the raw fetch() calls. The branch and main rewrite the exact same fetchOffer/verifyVenueCode bodies in incompatible ways, producing a genuine merge conflict in offer.ts.
fix/android-23-migrate-critical-apis-request-ts
Done
Unassigned
no QA note conflicts
3 files · +41/−132
review & merge notes
Risk: Code quality of the branch is good: the skipAuth design is correct (a 401 on a login endpoint means bad credentials, not an expired session, so bypassing logout teardown is right), call sites were audited, and tsc/eslint show zero delta. The functional risk is the divergence from main. Main now uses getTokenOrLogout() which only guards the missing/expired-token-BEFORE-the-request case; the branch's wrapper additionally centralizes 401-RESPONSE refresh+retry+auto-logout, which is the stronger fix the ticket actually asked for. Merging blindly would clobber one approach with the other. Note ticket scope is also only partially done either way: venue.ts, fcm.ts (incl. the ad-hoc clearToken() at fcm.ts:43 the ticket explicitly calls out), signup.ts, and the remaining offer.ts endpoints are untouched on the branch.
Merge: Does NOT merge cleanly: merge-tree reports CONFLICT (content) in features/offers/api/offer.ts. main diverged via commits a628f8e/f0b04ac/9bc1116 which adopted getTokenOrLogout() from @shared/utils/session for fetchOffer/verifyVenueCode while the branch migrated those same functions onto get()/post(). Resolve by hand: keep the branch's request.ts skipAuth addition and auth.ts OTP migration (these merge clean), then manually reconcile offer.ts by re-applying the get()/post() migration on top of main's current getTokenOrLogout()-based version. Decide explicitly whether the request.ts-wrapper approach (full 401 refresh+retry) or main's getTokenOrLogout() approach is the intended standard before merging.
Vineet Kumar · 2026-06-12Auto-fix bot comment (not QA): claims FIXED. Migrated requestOtp/verifyOtp (skipAuth) + offer.ts fetchOffer/verifyVenueCode onto request.ts. Verified via tsc (0 delta), eslint, and emulator OTP-send. Notes venue.ts/fcm.ts/signup.ts left as follow-up. No QA sign-off.
ANDROID-24 Doc-only ticket. Branch adds a new CLAUDE.md (140 lines) whose Gotcha #5 documents the committed google-services.json / Firebase Web API key as a knowingly-accepted exposure, with the required pre-launch controls (key restrictions, per-API allowlist, App Check). Matches the ticket's no-code-change intent. Jira is Done/Done, unassigned, no QA sign-off. Merges cleanly.
fix/android-24-document-firebase-key
Done
Unassigned
no QA note ready to merge
1 files · +140/−0
review & merge notes
Risk: Zero code risk: the only change is a single new markdown documentation file (CLAUDE.md); no source, build, or config files touched. Content is accurate and matches the ticket: it confirms google-services.json is intentionally committed, explains the Firebase Web API key is a client-side identifier rather than a server secret, and lists the correct mitigations (Android app + SHA-256 restrictions, per-API allowlist, Firebase App Check). Minor scope note: ticket nominally pointed at google-services.json/app.json, but since it explicitly says "no code change" and is a launch-notes documentation task, recording it in CLAUDE.md is appropriate. The documented controls are recommendations to be actioned in Google Cloud Console before launch — they are not (and cannot be) verified from this repo.
Merge: Clean. Single new file (CLAUDE.md), merge-tree --write-tree produced no CONFLICT. cherry shows the one commit (e4c8d91) is not yet in main. No overlap with other branches. Safe to merge independently. Note this is documentation only; the actual Google Cloud / Firebase App Check restrictions still need to be enabled and verified outside the repo before the Android launch.
Vineet Kumar · 2026-06-12Auto-fix attempt, fixed and verified. Expanded Gotcha #5 in CLAUDE.md documenting google-services.json (Firebase Web API key) as an intentionally committed, knowingly-accepted exposure. Lists required pre-launch controls: Android app restrictions (package ae.alist.android + SHA-256), per-API allowlist (FCM/Remote Config), Firebase App Check (Play Integrity). Doc-only, no code change. Commit e4c8d91.
ANDROID-25 Branch adds android.blockedPermissions=[com.google.android.gms.permission.AD_ID] to app.json. This is the correct Expo/EAS mechanism to strip the AD_ID permission that Firebase/Intercom can implicitly inject on Android 13+, aligning the merged manifest with a "No" advertising-ID Data Safety answer. App has no ad SDK use-case. Single clean commit, valid JSON, placed correctly inside the android config block, no conflicts with main, not yet in main.
fix/android-25-ad-id-permission
In Review
Unassigned
no QA note ready to merge
1 files · +3/−0
review & merge notes
Risk: Low risk. Change is a 3-line config-only addition (blockedPermissions array) correctly nested in expo.android of app.json; verified valid JSON and proper placement. blockedPermissions only takes effect in a compiled EAS build, so it cannot be confirmed by static repo inspection alone, but the syntax and permission name are correct. No functionality impact since the app uses no advertising SDKs. The remaining required step is non-code: the Play Console Data Safety form must be manually set to "No" for advertising-ID collection — that cannot be enforced by the branch.
Merge: Clean. Merges into main with no conflicts (merge-tree produced a tree with no CONFLICT markers). Touches only app.json; no overlap with other launch branches. After merge, build an EAS artifact and confirm the merged AndroidManifest no longer contains AD_ID, and update the Play Console Data Safety form to answer "No" to advertising-ID collection.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added android.blockedPermissions with com.google.android.gms.permission.AD_ID to app.json so EAS injects a remove node stripping the implicitly-injected permission. JSON validity confirmed. Notes Play Console Data Safety form must be manually set to "No" for advertising-ID collection. No human/QA verification.
ANDROID-26 ANDROID-26 trims unused Android permissions in app.json (removes CAMERA, READ/WRITE_EXTERNAL_STORAGE; keeps READ_MEDIA_IMAGES). Branch is a clean 1-commit, 1-file change that merges cleanly into main. Verified against main that no camera-capture or external-storage-write code exists, so removals are correct and low-risk. Jira still In Review, Unassigned, no resolution, no QA verification comment. Ready to merge; follow up with EAS prebuild and Data Safety form update post-merge.
fix/android-26-trim-android-permissions
In Review
Unassigned
no QA note ready to merge
1 files · +1/−4
review & merge notes
Risk: Low risk, single-file app.json edit. Verified against origin/main: launchCameraAsync / requestCameraPermissionsAsync / useCameraPermissions all return zero hits, so CAMERA is genuinely unused. All image input is gallery-only via ImagePicker.launchImageLibraryAsync (history, profile, license, ImageUploadSlot, UploadBottomSheet). No MediaLibrary/file-write usage, so WRITE_EXTERNAL_STORAGE removal is safe; READ_EXTERNAL_STORAGE is superseded by READ_MEDIA_IMAGES on targetSdk 35 (deprecated on API 33+). READ_MEDIA_IMAGES correctly retained for gallery access. Diff matches the documented fix exactly. Only residual: requires EAS prebuild to regenerate AndroidManifest.xml and Data Safety form must be updated to match the trimmed set; neither is code-blocking.
Merge: Clean. merge-tree --write-tree produced a tree with no CONFLICT against origin/main. Single 1-commit branch (c913324) touching only app.json; not yet in main (cherry shows "+"). Safe to merge standalone. Post-merge: run EAS prebuild and update the Play Console Data Safety / permissions declaration to reflect READ_MEDIA_IMAGES only.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): removed CAMERA, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE from app.json; kept READ_MEDIA_IMAGES. Grep evidence: zero camera-capture API hits, all image input is gallery-only launchImageLibraryAsync. JSON valid, tsc no regression. Notes runtime/manifest verification needs EAS prebuild, not done.
ANDROID-27 Branch adds iOS Info.plist photo/camera usage strings and configures the expo-image-picker config plugin in app.json, exactly as the ticket requires. Single-file JSON change, merges cleanly, low risk.
fix/android-27-ios-infoplist-photo-strings
In Review
Unassigned
no QA note ready to merge
1 files · +14/−1
review & merge notes
Risk: Low risk. The change is confined to app.json: adds expo.ios.infoPlist with NSPhotoLibraryUsageDescription, NSCameraUsageDescription, and NSPhotoLibraryAddUsageDescription, plus an expo-image-picker plugin entry with matching photosPermission/cameraPermission. This directly satisfies the ticket (infoPlist was {} and the plugin was absent). The dual approach (infoPlist + plugin) is redundant but harmless and is the safest way to guarantee strings land in Info.plist on prebuild. It also adds ios.bundleIdentifier ae.alist.ios, which is slightly out of the ticket's stated scope but is correct/necessary for an iOS build and not risky. JSON is valid and no new TS errors were introduced. Not runtime-verified: requires an iOS prebuild to confirm injection into Info.plist, which was not possible in the auto-fix environment. No microphone string added, which is correct since no mic usage was found.
Merge: Clean. merge-tree --write-tree produced a tree with no CONFLICT markers; cherry shows the commit (a18bde6) is not yet in main. Single commit, single file (app.json). Recommend a quick `expo prebuild` sanity check before/after merge to confirm the strings appear in the generated Info.plist, but no code-level merge concerns. Note: ticket is unassigned and has no QA verification comment yet, only the auto-fix bot comment.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added ios.infoPlist with NSPhotoLibrary/NSCamera/NSPhotoLibraryAdd usage strings, ios.bundleIdentifier ae.alist.ios, and expo-image-picker plugin with matching photos/camera permissions. Verified: JSON parses, tsc error count unchanged (131). Runtime/prebuild not verified (no iOS env).
ANDROID-28 ANDROID-28 is a Play Console compliance task (Data Safety form, Content Rating questionnaire, Target Audience band) that cannot be solved with repo code. Live Jira: status "To Do", Unassigned, no resolution. The single comment (Vineet Kumar, 2026-06-12) explicitly marks it BLOCKED/needs-human because the work requires Play Console access, not a code change. No fix branch exists. Nothing to review or merge.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: Not a code defect — this is a mandatory Play Store listing compliance task. Real risk is launch-blocking: if the Data Safety declaration, Content Rating, and Target Audience do not match the app's actual data collection (name/email/phone/WhatsApp/DOB/nationality/gender, profile/license/redemption photos, FCM token, Intercom chat, YouTube OAuth) and UGC+live-chat features, Google will reject the listing. Requires declaring encryption in transit, third-party sharing (Intercom/Google/Firebase), a deletion path, "yes" to UGC + in-app communication with a working report/moderation path, and an adult (non-child) audience band. P0 / S6 compliance item; must be done by a human with Console access before launch.
Merge: No branch, no code, nothing to merge. Console-only task — assign to someone with Play Console access; cannot be closed by the auto-fix pipeline.
Vineet Kumar · 2026-06-12Auto-fix triage BLOCKED (needs human): Play Data Safety form / Content Rating / Target Audience are Play Console tasks, not code. Needs someone with Console access; data-inventory list is already in the ticket. Scoped out of auto-fix pipeline (repo-only).
ANDROID-29 ANDROID-29 is a P0 store-policy/compliance task to publish public account-deletion and privacy-policy URLs and enter them in Play Console. Live Jira: To Do, Unassigned, no resolution. Last (only) comment by Vineet Kumar (2026-06-12) marks it BLOCKED/needs-human — work is on web/backend/console, outside alist-android, so the auto-fix pipeline scoped it out. No fix branch exists; no code review applicable. Verdict: no-branch.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: This is a store-policy/compliance task (S6, P0), not an Android code change. The work is to stand up a public https://alist.ae/delete-account page and confirm a canonical public privacy-policy URL, then enter both in Play Console > App content. Currently deletion is only reachable in-app behind login and the privacy policy is fetched at runtime and rendered behind the auth-gated Profile tab with errors swallowed — Play's Data Safety form cannot be completed, blocking the listing. The fix lives on web/backend + Play Console, not in alist-android, so no branch is expected here. Open question: web/backend ownership for both pages remains unresolved. Status is correctly To Do; no QA signal expected for a console/web task.
Merge: Nothing to merge — no branch and no code change in alist-android. Action is out-of-repo: publish the two public URLs on alist.ae and configure Play Console App content / Data Safety. Assign to a human with web/backend + Play Console access. Optionally surface the privacy policy on login/signup (app/index.tsx, features/home/api/legal.ts) as a follow-up, but that is not required to unblock.
Vineet Kumar · 2026-06-12Auto-fix triage marked BLOCKED (needs human). Public account-deletion + privacy-policy URLs must be published on the website/backend (alist.ae), outside this repo. Scoped out by the auto-fix pipeline 2026-06-12 since fixes are restricted to alist-android; needs backend/web/console/account access or a human decision.
ANDROID-30 P0 release-blocker, still unfixed. No fix branch exists. Bug confirmed live on origin/main: deleteUserAccount() in features/profile/api/profile.ts:149-150 still hits /signup/social-media/profile/delete — the social-profile-delete endpoint flagged in the ticket. No real account-deletion endpoint is wired. Jira status To Do, Unassigned, unresolved. No QA verification.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: HIGH RISK / unresolved. On origin/main (6929044), deleteUserAccount() (profile.ts:149) still posts to /signup/social-media/profile/delete, identical to the social-profile path the ticket says is wrong. The function's own docstring claims it "schedules account for deletion (90 day recovery period)" while the URL only deletes the linked social profile — exactly the misrepresentation that makes this a Play User Data policy violation, not just a functional bug. Mohammed Elhatmi's comment "Api endpoint is correct" is unsupported and contradicts the code and the triage; if treated as a backend confirmation it would still need (a) proof the backend re-mapped that URL to full account+data deletion, and (b) a distinct response + end-to-end test that the same credentials no longer return profile data. None of that is evidenced. Open question (correct endpoint + retention window) remains open.
Merge: Nothing to merge — no branch and no code change anywhere. Cannot close. Needs a backend decision: either confirm-and-document that /signup/social-media/profile/delete performs full account+data deletion (with end-to-end verification), or wire deleteUserAccount() to the real endpoint. Then a code change + QA verification before this P0 can move off To Do.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "Api endpoint is correct" — bare assertion from a non-QA dev, no detail. Prior comment (Vineet Kumar, same day): auto-fix BLOCKED, deleteUserAccount() points at social-profile-delete endpoint, real account-deletion endpoint unknown; needs backend/human decision. Scoped out of auto-fix pipeline.
ANDROID-31 ANDROID-31 (Remove debug console.log spam) is already resolved in main — the dev independently deleted both the CustomModal UAE CountryCodeItem debug block and the InviteFriendsBottomSheet INVITATIONS DEBUG block, and commented "Already done." The fix branch makes the same removals but now conflicts with main and is superseded. One minor item not yet in main: branch converts CustomModal line 323 console.log("Scroll error") to a silent catch. Jira still "In Review", Unassigned, unresolved, no QA verification.
fix/android-31-remove-console-spam
In Review
Unassigned
no QA note already in main
2 files · +2/−31
review & merge notes
Risk: The ticket's core goal is already achieved in main: the dev independently removed both target debug blocks. Main's CustomModal no longer has the per-row "CountryCodeItem Debug" UAE block, and main's InviteFriendsBottomSheet no longer has the "INVITATIONS DEBUG" block. The branch (commit fccdcf2) does the same removals, so its primary value is already delivered. Two divergences remain: (1) Main still contains console.log("Scroll error:", error) at CustomModal line 323 — the branch converts this to a silent catch, so that one cleanup is NOT yet in main. (2) In InviteFriendsBottomSheet, main's refactor went further than the branch and dropped the setInvitedUsers(initialInvitedUsers) sync call inside the useEffect, leaving the effect computing newUsersJson/currentUsersJson but doing nothing with them (dead code, and a possible behavior change since state no longer re-syncs on prop change). That is a pre-existing concern in main, not introduced by this branch. Low overall risk for the launch — the production log spam is gone.
Merge: Do not merge this branch as-is: merge-tree reports CONFLICT on both files because the dev already rewrote the same regions in main. The branch is effectively superseded by the dev's direct-to-main change (see "Already done" comment). The only thing main still lacks is the scroll-error console.log -> silent catch cleanup at CustomModal line 323; if that matters, cherry-pick just that hunk rather than the whole branch. Recommend abandoning the branch and closing the ticket as already-done, optionally with a tiny follow-up for the residual scroll-error log and the dead newUsersJson/currentUsersJson code in InviteFriendsBottomSheet.
Mohammed Elhatmi · 2026-06-12Dev comment: "Already done" — confirming the debug-log removal was handled directly in main. (Prior comment 13913 by Vineet Kumar logged the auto-fix attempt on the branch, fixed-unverified, commit fccdcf2.)
ANDROID-32 ANDROID-32 is an investigation/visual-parity Bug (SL46 notifications list, SL79 license upload) still in To Do, Unassigned, no resolution, and no fix branch. It is explicitly blocked: it needs current iOS reference screenshots which are not available in this repo, and was scoped out of the auto-fix pipeline as requiring a human decision.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: No code change exists; this is an open investigation ticket, not a deliverable fix. It is blocked on external input — iOS reference screenshots for SL46 (Notifications list) and SL79 (License upload) — which are unavailable in the alist-android repo. The description notes the highest-risk divergence points (native Alert.alert styling, country-code picker using iOS-only presentationStyle='overFullScreen' ignored on Android: CustomModal.tsx:361-366, Modal.tsx:143-148), but nothing has been verified live (visual). Not actionable without a human providing the design/iOS reference.
Merge: Nothing to merge — no branch, no commits. Not a launch blocker in code form; either obtain the SL46/SL79 iOS reference screenshots and assign for live visual comparison, or defer post-launch. Note dependency: most popup divergence is expected to resolve once Alerts migrate to ConfirmModal (tracked separately).
Vineet Kumar · 2026-06-12Auto-fix triage — BLOCKED (needs human). Needs current iOS reference screenshots (SL46 notifications list, SL79 license upload) to compare against; visual-parity work requires a design/iOS reference not in this repo. Scoped out by auto-fix pipeline.
ANDROID-33 ANDROID-33 (Bug, "Strip leading '@' from IG/TikTok handle") is Done/Done, Unassigned, with no fix branch. Both the auto-fix code inspection and live Pixel 10 emulator QA confirmed the bug is NOT REPRODUCED — no code path adds an '@', and the handle already renders correctly (nk.subin). Mohammed Elhatmi confirmed "Already fixed". Verified against origin/main: profile.tsx returns the trimmed handle verbatim. No merge action required.
Done
Unassigned
QA verified no branch
review & merge notes
Risk: NOT REPRODUCED — closed without code change. No fix branch exists. Live Jira: status Done, resolution Done, assignee Unassigned (matches board snapshot). The reported '@'-prefix bug could not be reproduced: code inspection and live emulator QA both confirm no code path prepends '@' to the handle. I spot-checked origin/main app/main/(tabs)/profile.tsx:38-39 — generateUsername returns profileData.instagram_url?.trim() verbatim with no '@' injection, consistent with the ticket's analysis. Display and save paths only apply .trim(). Risk of merging nothing is effectively zero; the desired behaviour already holds in main. Minor residual: there is still no defensive strip of a user-typed leading '@' on save, so if a user manually enters "@handle" it would be stored as-is — but that was out of scope and not the reported defect.
Merge: Clean — nothing to merge. No fix branch (fix branch = NONE) and no commits/diff associated with this ticket. The behaviour is already correct in origin/main (verified at HEAD 6929044). QA-verified as not reproduced; ticket correctly resolved as Done with no integration action needed.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "Already fixed". Prior comment by Vineet Kumar (auto-fix attempt, result: already-correct / NOT REPRODUCED) — code inspection of display paths (profile.tsx, UserProfileSection.tsx) and save paths (SocialProfileItem.tsx, social-profiles.tsx, api/profile.ts) found no code path that prepends '@'; emulator QA on Pixel 10 (Android 17) confirmed handle renders as "nk.subin" with no leading '@'. No code change required.
ANDROID-34 ANDROID-34 fix branch is a correct, minimal, clean-merging change matching the ticket spec: swaps the bouncy Animated.spring open for symmetric damped Animated.timing in CustomPinModal. Ready to merge; runtime animation still unverified by QA.
fix/android-34-pin-popup-animation
In Review
Unassigned
no QA note ready to merge
1 files · +4/−3
review & merge notes
Risk: Correct and minimal fix that matches the ticket recipe exactly. Replaces the asymmetric Animated.spring (tension:60, friction:12) open — the overshoot/bounce that caused the reported "jumping" — with Animated.timing(toValue:0, duration:280, Easing.out(Easing.cubic), useNativeDriver:true), now symmetric with animateOut()'s 280ms timing slide. Easing is properly added to the react-native import. useNativeDriver preserved. Scope is one file, 4/-3 lines, no API or state changes. Low risk. Only caveat: runtime animation smoothness is not statically verifiable and has no human/QA video verification yet, as the ticket itself flags.
Merge: Clean. merge-tree --write-tree against origin/main produced a tree with no CONFLICT; single commit 418b6e6 is not yet in main (cherry shows +). Touches only features/offers/components/CustomPinModal.tsx, no overlap with other launch tickets. Safe to merge independently; recommend a quick visual/video QA of the pin popup open animation before closing per the ticket's LIVE TEST recipe.
Vineet Kumar · 2026-06-12Auto-fix attempt (bot), status "fixed-unverified": added Easing import; in animateIn() replaced Animated.spring(tension:60,friction:12) with Animated.timing(duration:280, Easing.out(Easing.cubic)) to mirror animateOut(). TS 133->133 errors (zero delta), no new ESLint. Notes runtime animation needs visual/video QA. Branch fix/android-34-pin-popup-animation, commit 418b6e6.
ANDROID-35 ANDROID-35 fix branch conflicts with origin/main and is largely superseded. Branch adds a canAskAgain + Open Settings Alert to permission-gated pickers, but main refactored all target pickers to drop the explicit permission request, and deleted one touched file. Static-verified only, no QA sign-off, status still In Review / Unassigned.
fix/android-35-photo-library-settings-link
In Review
Unassigned
no QA note conflicts
5 files · +79/−7
review & merge notes
Risk: The branch (single commit 829707d) patches the OLD permission-gated picker code, adding a canAskAgain check + "Open Settings" Alert across 5 files. But origin/main has independently refactored ALL of these pickers to NO LONGER call requestMediaLibraryPermissionsAsync() at all — every picker now invokes launchImageLibraryAsync() directly (license.tsx pickFromLibrary, offers/home ImageUploadSlot, profile.tsx openImageLibrary, UploadBottomSheet x4). The branch's core premise (explicit permission request that dead-ends on denial) no longer matches main, so the fix is largely superseded. The change itself is logically correct against the old code and low-risk in isolation (UX-only, static-checked), but it has NOT been runtime-verified and no QA sign-off exists. offers/ImageUploadSlot.tsx on main already imports Linking, hinting the dev addressed settings deep-linking differently.
Merge: Does NOT merge cleanly into main. merge-tree reports: (1) CONTENT CONFLICT in app/profile/license.tsx — branch edits the old permission-request/toast block, but main rewrote pickFromLibrary to drop the permission request entirely; (2) MODIFY/DELETE conflict on features/home/components/ImageUploadSlot.tsx — main DELETED this file while the branch modified it. The branch is effectively superseded by main's picker refactor: re-evaluate whether ANDROID-35 is still a live bug against main's current launchImageLibraryAsync()-only flow before doing any merge. If still wanted, the fix must be re-authored on top of main's new picker structure rather than merged as-is.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): 5 files updated to check canAskAgain after failed requestMediaLibraryPermissionsAsync() and show an actionable "Open Settings" Alert (Linking.openSettings()) instead of dead-end toast. Verified by static checks only (TSC 131→131, ESLint warnings 14→11). Runtime not verified — needs a device with permanently-denied photo permission. Commit 829707d.
ANDROID-36 ANDROID-36 adds a well-built shared animated ConfirmModal (slide up/down, queued, Promise-based, native fallback) and migrates 5 of ~63 Alert.alert sites. The new component file is clean, but the branch conflicts with main in all three files it edits because another dev rewrote offer.tsx and InviteFriendsBottomSheet.tsx after the branch's merge-base. Not in main, not QA-verified, runtime animation unverified. Needs rebase + manual re-application of the migration sites before it can merge.
fix/android-36-confirm-modal-component
In Review
Unassigned
no QA note conflicts
4 files · +391/−106
review & merge notes
Risk: ConfirmModal.tsx is a clean new file and the implementation is sound: 250ms Animated.timing translateY (slide up on open, down on close) meeting the SL35/43/65/66/80 requirement, FIFO concurrent-call queue, non-cancelable parity (backdrop pointerEvents none, no-op onRequestClose), and a native Alert.alert fallback when the host is not yet mounted. Imperative confirm() returns Promise<boolean>. Per the author's note, tsc shows zero error delta and eslint is clean on the 4 touched files. Main correctness risk: runtime slide-up/slide-down animation was never visually verified (no QA pass), and only 5 of ~63 Alert.alert sites were migrated (intentionally bounded scope), so the broader popup-animation defect persists app-wide. No QA verification comment exists.
Merge: Does NOT merge cleanly. git merge-tree reports CONFLICT (content) in all three edited files: app/_layout.tsx, app/main/offer.tsx, and features/offers/components/InviteFriendsBottomSheet.tsx. Only the new shared/components/modals/ConfirmModal.tsx adds cleanly. Cause: after this branch's merge-base (06b9088, Jun 12), dev Mohammed heavily rewrote the same files on main on Jun 18 — offer.tsx (commit 48bc60f, +320/-161) and InviteFriendsBottomSheet.tsx (commit cc03567, -96), plus app/_layout.tsx (072c6be). The migration call sites in this branch overlap those rewrites. No ConfirmModal exists in main, so the work is NOT superseded — but it must be rebased onto current main and the 5 Alert.alert migration sites re-applied by hand against the rewritten offer.tsx / InviteFriendsBottomSheet.tsx. The _layout.tsx conflict is trivial (just the ConfirmModalHost import + mount). Re-verify the SL43 cancel-event flow after rebase since that handler region was rewritten on main.
Vineet Kumar · 2026-06-12Author's own auto-fix note: added shared/components/modals/ConfirmModal.tsx (RN Modal + Animated.timing translateY, slide up on open / down on close, imperative confirm() Promise<boolean>, FIFO queue, native-Alert fallback); mounted ConfirmModalHost at root; migrated 5 reported Alert.alert sites in offer.tsx and InviteFriendsBottomSheet.tsx; SL43 alert moved out of state-updater. tsc 0-delta, eslint clean. Runtime slide animation explicitly NOT visually verified; needs manual QA screen-record.
ANDROID-37 Fix replaces silent .catch(()=>{}) blocks in ReviewStatusRedemption.tsx with error-state flags + error Toasts, and short-circuits renderExpandableContent to show a red error message instead of misleading "pending" placeholder squares on fetch failure. Logic is correct and complete, but the branch does not merge cleanly: main's ee68ab1 modified the same file after the branch point, producing a content CONFLICT in ReviewStatusRedemption.tsx. Fix is NOT yet in main (main still has empty .catch blocks at lines 99/107). Note: despite the ANDROID project key this is a React Native (TSX) codebase. Jira still In Review, Unassigned, no QA verification — only a dev note that behavior matches iOS.
fix/android-37-review-detail-error-state
In Review
Unassigned
no QA note conflicts
1 files · +44/−2
review & merge notes
Risk: Change is functionally correct and low-risk in isolation: error booleans set in both catch handlers, reset on item identity change (same effect as the null reset), hasFetchError gates the expandable render per displayTab, and a Toast informs the user. The branch already contains main's shouldFetchNow/fetchKey/refreshVersion fetch-gating, so the fix is layered on the right structure. Minor: error flags are only reset on item.id/reviewStatus change and at fetch start, not on collapse/retry, so the inline "tap to collapse and try again" message is the recovery path — acceptable. New react-native-toast-message import assumed already a project dep. No type/lint regressions reported.
Merge: Does NOT merge cleanly — merge-tree reports CONFLICT (content) in features/history/components/ReviewStatusRedemption.tsx because main commit ee68ab1 changed the file after the branch was cut. Conflict is mechanical/contextual, not logical: resolve by keeping main's current structure (shouldFetchNow/fetchKey logic, which the branch already mirrors) and re-applying the branch's added lines — the two FetchError useState flags, their resets in the identity-change effect and at fetch start, the Toast.show calls inside both .catch blocks, the hasFetchError computation, the error-message branch in renderExpandableContent, and the errorText style. Rebase the branch onto current origin/main and re-verify, then merge. No cross-ticket conflict detected.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "This behavior matches iOS" (a dev sign-off that the new error-state behavior is consistent with iOS). Prior comment is Vineet Kumar's auto-fix bot note (fixed-unverified): added venueReviewFetchError/rejectedDetailsFetchError flags, toasts in both .catch blocks, error-message render short-circuit; TS delta 0, ESLint 0 new, no emulator QA.
ANDROID-38 Single-commit branch (d175078) fixes the multi-line comment box cropping in CommentInput.tsx exactly as the ticket prescribed: replaces fixed height:120 with minHeight:120/maxHeight:160 to let the field grow, adds scrollEnabled={true} so overflow text remains accessible, and moves lineHeight:20 out of the iOS-only Platform spread so Android line spacing is normalised too. Change is small (1 file, +4/-2), well-scoped, and merges cleanly into main with no conflicts.
fix/android-38-review-comment-box-crop
In Review
Unassigned
no QA note ready to merge
1 files · +4/−2
review & merge notes
Risk: Low risk. The diff is a precise match for the ticket's prescribed fix and touches only CommentInput.tsx styling/props. Correctness is sound: minHeight allows growth, maxHeight+scrollEnabled prevents unbounded expansion while keeping overflow scrollable, and the unconditional lineHeight fixes the Android-specific tight line wrapping. No logic changes. Only outstanding gap: never visually verified on a release build because UploadBottomSheet crashes on mount in the dev build (separate 'property is not configurable' bug), so the actual on-device scroll/clipping behaviour is unconfirmed.
Merge: Clean. Single isolated commit on CommentInput.tsx, no conflicts with main (merge-tree wrote tree 247fe11 with no CONFLICT). Safe to merge independently of other tickets. Recommend a quick visual check of the review comment box on a preview/release build post-merge since dev-build verification was blocked.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): CommentInput.tsx changed height:120 -> minHeight:120 + maxHeight:160, added scrollEnabled, applied lineHeight:20 unconditionally. TSC/eslint clean. NOT verified on emulator because UploadBottomSheet crashes on mount in dev build ('property is not configurable', separate bug). Needs verification on preview/release build. Branch fix/android-38-review-comment-box-crop, commit d175078.
ANDROID-39 Adds a canonical ReviewStatus enum and partially adopts it, but the refactor is substantially incomplete versus the ticket's stated scope. Merges cleanly into main and is behavior-preserving where applied.
fix/android-39-review-status-enum
In Review
Unassigned
no QA note needs work
4 files · +49/−10
review & merge notes
Risk: Functionally low-risk where applied: getOfferStatus in historyUtils.ts was migrated to named ReviewStatus constants with the exact same numeric mapping (behavior-preserving). The new enum itself is sound and correctly documents 0=approved,1=not_uploaded,2=overdue,3=under_review,4=rejected,5=skip_required,6=exempted, and the misleading Types.ts comment (which wrongly said 2=approved) is fixed. BUT the change does not meet its own acceptance criteria: the ticket requires refactoring getStatusConfig, ReviewStatusRedemption, RequestItem.tsx, and UploadBottomSheet.tsx to use the enum. In reality only historyUtils.ts imports it. UploadBottomSheet.tsx still has 10+ magic-number comparisons (reviewStatus===0/4/6, etc.) with only a comment changed; RequestItem.tsx is entirely untouched; getStatusConfig/ReviewStatusRedemption not migrated. The exported RedemptionStatus union and ReviewStatusValue type are defined but never used. Also all doc comments (ReviewStatus.ts header, Types.ts, UploadBottomSheet) point to a non-existent path "types/reviewStatus.ts" — the actual file is constants/ReviewStatus.ts, which is misleading for the next dev. Net: the cross-file disagreement the ticket targets is only ~25% resolved.
Merge: Merges cleanly into main (merge-tree wrote tree d3eb93e, no CONFLICT). Not in main; 1 commit (10c1fdf). Do not merge as-is for ticket closure: send back to complete scope — (1) import ReviewStatus in UploadBottomSheet.tsx and replace the magic-number comparisons, (2) migrate RequestItem.tsx, getStatusConfig, and ReviewStatusRedemption, (3) fix the doc-path references from "types/reviewStatus.ts" to "constants/ReviewStatus.ts". If only the partial historyUtils.ts cleanup is wanted now, it is safe to merge but the ticket should stay open. No QA sign-off present; assignee Unassigned.
Vineet Kumar · 2026-06-12Auto-fix bot comment (fixed-unverified): added constants/ReviewStatus.ts canonical enum, fixed wrong inline comment in Types.ts (was 2=approved, now 2=overdue), refactored getOfferStatus in historyUtils.ts to named constants, updated UploadBottomSheet legend comment. Verified static-only: TSC delta 0 (133 baseline/post), no new eslint errors. No runtime/QA verification. No human QA sign-off.
ANDROID-40 Client-only fix adds a reviewStatus===4 backstop in UploadBottomSheet.tsx blocking storeReviewFeedback unless fresh uploads exist this session. Merges cleanly into main, not yet present. Needs work: only requires one fresh story upload (ticket wants all required slots), no Submit-button gate or server backstop, and QA never verified (data/release-build blocked).
fix/android-40-rejected-review-images-required
In Review
Unassigned
no QA note needs work
1 files · +28/−0
review & merge notes
Risk: The new reviewStatus===4 guard correctly closes the reported hole (text-only resubmission when all slot statuses default to 0 after URL-regex match failure) and reuses the existing perUploadStatusOverride session-freshness signal already used by the per-slot guard directly above it. All referenced symbols (storySlotCount, hasReviewScreenshot, reviewStatus, setSwiperIndex, perUploadStatusOverride) exist in scope; code is internally consistent. Two gaps vs. ticket spec: (1) freshStoryUploaded uses .some(Boolean) so it requires only AT LEAST ONE fresh story upload, not EVERY required slot as the ticket demands — a multi-slot rejected review can still resubmit after replacing just one image; (2) no server-side backstop and no Submit-button gating, both explicitly requested. Low runtime risk (additive guard, no behavior change for non-rejected reviews) but partial correctness. QA never verified live (data + release-build blocked).
Merge: Clean — merge-tree --write-tree returned a tree OID with no CONFLICT against origin/main. Single new commit f00c3b5, one file (+28/-0). Not in main (cherry shows +). Recommend tightening .some() to require all required story slots fresh and adding the requested Submit-button gate / server backstop before merge; otherwise applies cleanly with no conflicts.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added a reviewStatus===4 backstop guard in handleNextSlide on the submit slide of UploadBottomSheet.tsx, requiring fresh uploads this session via perUploadStatusOverride before storeReviewFeedback. TSC 131->131 (no new errors), ESLint clean. Runtime QA BLOCKED: no rejected review for subin@alist.ae, bottom-sheets crash on dev build. Commit f00c3b5.
ANDROID-41
fix/android-41-offer-status-single-source
In Review
Unassigned
no QA note conflicts
6 files · +191/−44
review & merge notes
Risk: Fix is well-implemented and matches the ticket intent: a single deriveOfferStatus() (shared/utils/offerStatus.ts) is consumed by both History list transforms (transformRedeemedOffers/transformPendingOffers in historyUtils.ts) and the offer detail screen (offer.tsx), so list and detail can no longer derive status independently. Rejection flags (review_rejected_status===1 || insta_stories_rejected_status===1) now map to "rejected" - addressing the core defect where unmapped review_status (incl. 1) silently defaulted to "pending". Unknown status_title/review_status values are logged via console.warn instead of silently defaulting. Logic and precedence ordering are sound. Main remaining risk: NOT verified at runtime - no rejected request/review existed in dev data, so the actual list-vs-detail reconciliation was never observed live; QA verification is still outstanding. A residual backend gap (full rejection not reflected in redeemedOffers) is correctly identified as out of client scope.
Merge: Real merge conflict: git merge-tree reports CONFLICT (content) in app/main/offer.tsx. main independently rewrote offer.tsx (commit 48bc60f "Add/update app/main/offer.tsx") with many overlapping hunks, including the isAwaitingApproval / canonical-status region this branch edits. The other 5 files (offerStatus.ts new, historyUtils.ts, RequestItem.tsx, historyTypes.ts, Types.ts) auto-merge cleanly. Resolve manually: keep the branch's deriveOfferStatus-based canonicalOfferStatus and isAwaitingApproval = canonicalOfferStatus === "pending venue approval", and reconcile it against main's rewritten isAwaitingApproval/isDedicatedOffer logic in offer.tsx. After resolving the conflict, get a live QA pass (reject a review for the test account via the dev admin portal, then compare History Redemptions label vs the offer detail) since runtime verification is still pending.
Vineet Kumar · 2026-06-12Auto-fix attempt, result "fixed": new shared/utils/offerStatus.ts deriveOfferStatus used by both list transforms and detail; rejection flags treated as rejected; unknown values logged not silently defaulted. tsc/eslint clean (no new errors). Runtime/emulator NOT verified - test account has no rejected request in dev data. Notes a residual backend gap on full rejection in redeemedOffers (recommends backend ticket).
ANDROID-42 Adds .catch() to the two fire-and-forget async calls (requestPermissions, refreshToken) in NotificationProvider's useEffects and converts three silent catch{} blocks in useNotifications to log via console.warn. Directly resolves the unhandled-rejection bug. Branch is 1 commit not yet in main, merges cleanly, low risk.
fix/android-42-notification-provider-rejections
In Review
Unassigned
no QA note ready to merge
2 files · +12/−8
review & merge notes
Risk: Low risk. Change is purely defensive: it attaches rejection handlers and adds logging, no behavioral/control-flow change to the happy path. The catch blocks still treat permission/token errors as non-fatal (return false / no-op) which matches existing intent, just no longer swallowing silently. One gap vs. ticket intent: it uses console.warn instead of Sentry.captureException (Sentry not installed), so launch-day FCM/push-registration failures surface only in device/Metro logs, not in a remote error monitor — failures are no longer unhandled but remain harder to observe in production. Acceptable for merge; remote reporting is a follow-up once Sentry exists.
Merge: Clean. merge-tree --write-tree produced a conflict-free tree against origin/main; single commit 96ba510, +12/-8 across 2 files, not yet in main. No overlap with other launch branches detected. Merge as-is. Follow-up: swap console.warn for Sentry.captureException when Sentry is added. Not QA-verified and unassigned — assign/QA-check before/after merge per process.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added .catch handlers to the two fire-and-forget calls in NotificationProvider and replaced three silent catch{} blocks in useNotifications with catch(e) + console.warn. TSC errors unchanged (133), 0 in touched files, ESLint clean. Note: Sentry not installed, used console.warn instead. Commit 96ba510.
ANDROID-43 Branch extracts notification-channel creation into a new exported setupAndroidNotificationChannel() and calls it eagerly at app start (top of initializeNotifications), plus fixes lightColor to brand teal and renames the channel. Sound implementation of the ticket's intent, but conflicts with main because main independently edited the same channel block.
fix/android-43-eager-notification-channel
In Review
Unassigned
no QA note conflicts
1 files · +23/−8
review & merge notes
Risk: The change is correct and directly addresses the ticket: channel is created unconditionally on Android at app start (before permission/token), so backgrounded/killed FCM messages have a channel. setNotificationChannelAsync is idempotent, so the double-call from registerForPushNotificationsAsync and initializeNotifications is safe. lightColor corrected to brand teal #00A4B6. Only verification gap: no runtime/FCM background-delivery test was performed (author noted this). Low correctness risk; main concern is the merge conflict, not the code itself.
Merge: CONFLICT with origin/main in features/notifications/utils/notifications.ts. Main commit 9674715 already independently applied the lightColor fix (#FF231F7C -> #00A4B6) inside the original inline block in registerForPushNotificationsAsync, and also made an unrelated edit to handleNotificationReceived. The branch instead deleted that inline block and moved channel creation into a new setupAndroidNotificationChannel() function, so the two edits overlap on the same lines. Resolve by taking the branch's refactor (the eager setupAndroidNotificationChannel() called at app start is the actual ticket value, not yet in main) and keeping main's unrelated handleNotificationReceived change. The brand-color portion of the ticket is already in main; only the eager-creation part is novel. Re-run merge-tree clean after rebasing branch onto current main.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): extracted channel creation into exported setupAndroidNotificationChannel(), called eagerly at top of initializeNotifications() before permission/token; registerForPushNotificationsAsync delegates to it; lightColor fixed FF231F7C->#00A4B6; channel name "default"->"A-List Notifications". TSC delta zero, ESLint 0 new. Runtime/FCM background test not done.
ANDROID-44 Single-commit branch adds a dedicated white-silhouette Android notification small-icon (Git LFS asset) and updates app.json: expo-notifications icon -> notification-icon.png, color -> brand teal #00A4B6, and adaptiveIcon.monochromeImage -> the silhouette. Matches the ticket spec precisely. Merges cleanly into main. Not QA-verified; runtime push display unverified by the dev's own static-only pass.
fix/android-44-notification-small-icon
In Review
Unassigned
no QA note ready to merge
2 files · +6/−3
review & merge notes
Risk: Change is config-only (app.json) plus one new LFS image asset; low blast radius and the diff matches the ticket's prescribed fix (icon swap + #00A4B6 tint). Correctness of the config is high. Two open risks: (1) the entire fix is unverified at runtime - it requires expo prebuild --clean + an actual FCM push to confirm the status-bar icon renders as a proper tinted silhouette rather than a white box; no live test or QA sign-off exists. (2) The dev reused the tightly-cropped notification silhouette as adaptiveIcon.monochromeImage; that glyph may fall outside the adaptive-icon safe zone on Android 13+ themed launchers and ideally wants a separately padded monochrome asset. Neither is a blocker for merge but both should be eyeballed post-build.
Merge: Clean - merge-tree --write-tree produced a tree with no CONFLICT; cherry shows commit 821df12 is not yet in main. Touches only app.json and a new asset file, so no overlap with other ANDROID launch branches expected. After merge, run expo prebuild --clean, rebuild, fire a push (redeem/cancel) to verify the small icon, request a fresh SL77 screenshot, and visually check the themed-launcher monochrome icon safe zone.
Vineet Kumar · 2026-06-12Auto-fix attempt by Vineet Kumar: added new 96x96 pure-white 'A' silhouette notification-icon.png; pointed expo-notifications.icon at it and set color to brand teal #00A4B6; also switched adaptiveIcon.monochromeImage to the silhouette. Static checks pass (PIL pixel check, app.json parse, tsc no new errors). NOT live-verified - needs expo prebuild --clean + actual FCM push to confirm status-bar icon. Caveat: tightly-cropped glyph may sit outside adaptive-icon safe zone on themed launchers.
ANDROID-45 ANDROID-45 fix (commit 2fcbab9, 4 files +94/-46) is logically correct and still needed — it dedupes invited users by stable user id across RequestItem, history.tsx, and the bottom sheet, and replaces a fragile JSON.stringify re-sync effect with a content-keyed prop mirror. But it does NOT merge cleanly: main has since edited the same Types.ts and InviteFriendsBottomSheet.tsx (Skeleton import, onSkip props, and a botched no-op rewrite of the same effect), causing conflicts in both files. Jira still In Review, Unassigned, unresolved; only comment is the auto-fix note, no QA sign-off and no runtime verification (DEV-build bottom-sheet crash). Needs rebase + conflict resolution + release-build QA.
fix/android-45-invited-users-dedupe
In Review
Unassigned
no QA note conflicts
4 files · +94/−46
review & merge notes
Risk: The fix itself is correct and well-reasoned. Single commit 2fcbab9 touches 4 files (+94/-46). Logic: (1) RequestItem.tsx dedupes invitedusers[] by user id, preferring the record with a real name, before mapping to Invitation[] — sound, fixes SL53/SL56 avatar collapse and icon mismapping; (2) history.tsx dedupes invitations[] before formatting for the sheet; (3) InviteFriendsBottomSheet.tsx adds a dedupeInvitedUsers helper applied to initial state + a content-signature-keyed sync effect that no longer compares against local state (so it can't clobber in-flight edits) and drops debug logs; (4) Types.ts adds documentation comments confirming the id namespace and status enum. No new runtime risk; static checks pass per the dev comment. The open question is resolved correctly. Caveat: never runtime-verified (DEV-build bottom-sheet deepFreeze crash + needs a 2+ invite offer), and QA has not signed off — needs a release-build verification before it can be called done.
Merge: Will NOT merge cleanly: merge-tree --write-tree reports CONFLICT in constants/Types.ts and features/offers/components/InviteFriendsBottomSheet.tsx. Root cause: the branch was cut from an older main, and main has since landed independent edits to the same two files (commits dd24981/2a156ef on Types.ts; cc03567/a4163cb on the sheet — Shimmer->Skeleton import swap, new onSkip/canSkipInvitation props, and a partial cleanup of the very same re-sync effect). IMPORTANT: main's cleanup of that effect is botched — the dev removed the console.logs but left the effect a no-op that never calls setInvitedUsers, so on current main the sheet no longer syncs refetched invitations AND has no dedupe; the ANDROID-45 fix is the correct, more complete version and is still needed. Resolution path: rebase fix/android-45-invited-users-dedupe onto current origin/main, then resolve both files by taking the branch's dedupe + content-keyed sync effect while preserving main's Shimmer->Skeleton import and onSkip/canSkipInvitation additions. Re-run tsc/eslint and runtime-verify on a RELEASE build with a multi-invite offer before merging. (Comment also references ANDROID-46 as a paired branch on the consumption side.)
Vineet Kumar · 2026-06-12Auto-fix attempt marked "fixed (static checks pass, runtime verification gated)". Answered the open question: invitedusers[].id and invitations[].id are the SAME entity (backend invited_user_id); status enum 0=pending/1=accepted/2=rejected, so icons were NOT inverted (the "2=approved" suspicion came from the unrelated instaStoriesRejectedStatus enum). Added client-side dedupe in RequestItem + history.tsx + the bottom sheet, replaced the JSON.stringify re-sync effect with a content-keyed prop mirror, removed debug logs. Verified via tsc (131 errs unchanged) + eslint (0 on touched files). Runtime verification NOT done: bottom-sheet deepFreeze crash on DEV build + needs a multi-invite offer. Re-test on a RELEASE build.
ANDROID-46 Branch adds a refreshInvitedUsers() refetch+rebuild after each invite/re-invite/remove mutation in history.tsx (replacing the previous no-op that only nulled an in-memory cache), and adds success toasts on the three previously-silent paths in InviteFriendsBottomSheet. Merges cleanly into main; 1 commit, 2 files, +61/-10.
fix/android-46-invite-refetch-toasts
In Review
Unassigned
no QA note ready to merge
2 files · +61/−10
review & merge notes
Risk: Low risk and correct. refreshInvitedUsers mirrors the existing, proven handleShowInvitedUsers mapping exactly (same fetchOffer call, same status 0/1/2->pending/accepted/declined mapping, same setPendingInviteDetails + setCurrentInvitedUsers), so it directly fixes the stale-list root cause described in the ticket. Refetch failures are swallowed with a comment (acceptable — next sheet open refetches). All referenced symbols (fetchOffer, OfferDetailsApiResponse, setCurrentInvitedUsers, setPendingInviteDetails, currentCodeId) are in scope; Toast is imported in the sheet. Toast wording is sensibly differentiated (Invitation sent vs Companion added/removed) by mode. Minor: the inline ternary carries a redundant "as" cast and refetch adds a network round-trip per mutation, but neither is a defect. Caveat from dev comment: not runtime-verified — Invite-Friends sheet crashes on dev build (deepFreeze, gated by ANDROID-9), so behavior was only statically validated (tsc/eslint clean, no new errors).
Merge: Clean — merge-tree --write-tree produced no CONFLICT against origin/main. Heads-up per dev comment: ANDROID-47 (invitation-ID vs user-ID mismatch) touches the same invite/remove area; this branch was kept off those lines, but merge both together and re-test invite->remove on a RELEASE build (the sheet does not mount on the dev build due to a deepFreeze crash tracked under ANDROID-9). No QA verification yet, so verify on release before final sign-off.
Vineet Kumar · 2026-06-12Auto-fix attempt — FIXED (static checks pass, runtime blocked). Added refreshInvitedUsers() in history.tsx that refetches offer details and rebuilds formattedUsers after invite/re-invite/remove (replacing the stale setPendingInviteDetails(...,null)); added success toasts on previously-silent paths in InviteFriendsBottomSheet (view-mode add "Invitation sent", non-view add "Companion added", non-view remove "Companion removed"). tsc 131 errors before/after (zero new), eslint clean. Runtime NOT verified: Invite-Friends sheet won't mount on dev build (deepFreeze crash, gated by ANDROID-9); needs RELEASE-build re-test. Heads-up: ANDROID-47 touches same area.
ANDROID-47 ANDROID-47 (P0 bug, invite/re-invite/remove sending wrong ID, SL48/SL51/SL78) is To Do, Unassigned, unresolved, with no fix branch. The most recent investigation (Vineet Kumar, 2026-06-12) concluded NO CODE CHANGE IS NEEDED: reading the alist-portal backend source showed the ticket's premise is false. GET /offers/fetch/details maps invitations[].id = invited_user_id (the companion USER/Signup id), and /offers/invitation/add and /remove both expect that user id — exactly what the Android client sends. The Requests-tab list uses the invitation RECORD id only for accept/reject, which the client also handles correctly. Mohammed Elhatmi then commented "Already fixed / awaiting further testing." There is no QA verification (no Preji John or equivalent pass) and no code artifact to review.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: Premise of the bug appears to be wrong: per the backend-source analysis, the client already sends the companion USER id where the add/remove endpoints expect it, and uses the invitation RECORD id only for accept/reject — so there is likely nothing to fix in the Android client. If the user-reported symptoms (SL48/SL51/SL78: re-invite/remove silently no-ops, no push) are real, the root cause is most plausibly server-side (push queue delivery, or add/remove returning business-rule status:false). Runtime verification was never completed: the DEV build cannot mount InviteFriendsBottomSheet due to a @gorhom/bottom-sheet "property is not configurable" crash (tracked separately, ANDROID-9), so the flow was never observed live. The "Already fixed" comment is unsubstantiated — no branch, no commit, no QA pass backs it. Low residual risk for the Android launch since there is no code change to ship; main risk is mis-triage if the real (backend) issue is closed as fixed without a release-build re-test.
Merge: Nothing to merge — no fix branch exists and no code change was made or is recommended for this repo. Do not mark Done based on the "Already fixed" comment alone. Recommended next step: a human re-test on a RELEASE build (not DEV, which crashes on the bottom sheet) — open Invite friends from History, exercise add/re-invite/remove, and confirm POST /offers/invitation/add sends the companion user id (it should). If symptoms persist, route to a backend/portal ticket for push-queue/business-rule investigation rather than the Android client.
Mohammed Elhatmi · 2026-06-12"Already fixed / awaiting further testing." Prior comment (Vineet Kumar) is a detailed auto-fix analysis concluding NO CODE CHANGE NEEDED — the bug premise was disproven by reading the alist-portal backend source; invitations[].id is already the companion USER id, so the client uses it correctly.
ANDROID-48 In-flight lock for block+accept double-claim prevention is implemented exactly as the ticket prescribes. Lock acquired synchronously in proceedWithDeliverablesPress before opening the sheet; OfferBottomButton now truly disabled (disabled prop + opacity) while isProcessingClaim is true, and getButtonPressHandler returns a no-op plus handleDeliverablesButtonPress guards on the lock. Lock released on all confirm/error paths and on sheet pan-dismiss (onChange index -1). Diff is small (2 files, +24/-2), merges cleanly into main, single commit not yet in main.
fix/android-48-redemption-inflight-lock
In Review
Unassigned
no QA note ready to merge
2 files · +24/−2
review & merge notes
Risk: Correct and low-risk. Multiple layers of defense against double-tap: synchronous lock acquisition before the async block+accept, functional gate (no-op handler + early return in handleDeliverablesButtonPress), and visual/functional disable on the button. Lock-release coverage is thorough across success/error branches and the pan-dismiss path, addressing the stuck-lock concern the ticket flagged. Minor theoretical risk: the onChange(index===-1) release could race if the sheet momentarily reports -1 during the confirm transition, but handleDeliverablesConfirm manages its own lock state on confirm, so impact is negligible. No new TS/ESLint issues. Not exercised on a throttled connection (ticket asked for that); QA still pending.
Merge: Clean. merge-tree --write-tree produced a tree with no CONFLICT markers; touches only app/main/offer.tsx and features/offers/components/OfferBottomButton.tsx. Single commit 920c678 not yet in main. Safe to merge independently. Recommend a quick throttled-network smoke test post-merge per the ticket's test guidance, since no human/QA verification has occurred yet (status still In Review, unassigned).
Vineet Kumar · 2026-06-12Auto-fix attempt, marked "fixed-unverified" (not human-verified). Set isProcessingClaim(true) synchronously before opening deliverables sheet; added onChange handler to release lock on pan-dismiss (index -1); added disabled prop to OfferBottomButton (truly disabled + 0.5 opacity when processing/pending). TS error count unchanged 133; ESLint clean; no runtime QA per static-verify gating.
ANDROID-49 Single-commit branch fixing silent failures: empty catch{} in dedicated-offer apply and raw alert() leaking server errors on block-date failure. git merge-tree reports CONFLICT on both touched files. Current main has independently refactored both areas: the old handleDedicatedOfferApply (empty catch) no longer exists — the apply flow was rewritten with setIsProcessingClaim guards and Alert.alert error handling; and DeliverablesBottomSheetContent already replaces alert() with Toast.show plus 401 suppression. The branch is built on a stale base and its target code is gone.
fix/android-49-surface-dedicated-offer-errors
In Review
Unassigned
no QA note conflicts
2 files · +21/−7
review & merge notes
Risk: The branch change itself is correct and low-risk in isolation (proper error surfacing, processing-flag reset, 401 suppression kept). But it does not apply to current main: the offer.tsx hunks target a handleDedicatedOfferApply function that has been refactored away, and the DeliverablesBottomSheetContent fix is already present in main (Toast.show with 401 guard; main uses text1 only vs branch's text1+text2). Merging as-is is impossible (conflicts) and unnecessary — the underlying bugs appear already resolved in main by the dev's refactor. No QA verification; assignee Unassigned; resolution unset.
Merge: Do NOT merge. Conflicts on both app/main/offer.tsx and features/offers/components/DeliverablesBottomSheetContent.tsx — branch built on stale base. Underlying issues appear superseded by main's refactor: dedicated-apply flow rewritten with setIsProcessingClaim guards + Alert.alert error handling; block-date alert() already replaced by Toast.show with 401 suppression. Recommend: verify both error paths now surface a user-facing message in main; if so, close ANDROID-49 as superseded/done and abandon the branch. If any gap remains (e.g. preference for text2 server-message detail in block-date toast), apply a fresh small patch directly on main rather than rebasing this branch.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): replaced empty catch in handleDedicatedOfferApply with Toast.show + setIsProcessingClaim guards; replaced raw alert() in DeliverablesBottomSheetContent with Toast.show (401 suppression preserved). Verified static-only: TS 133 errors baseline unchanged, ESLint 0 errors. No runtime verification.
ANDROID-50 Branch replaces an occluded root-level Toast (hidden behind the @gorhom bottom-sheet portal on Android) with an inline Text error rendered inside the sheet above the Confirm button. One commit (e6386ad), one file, +14/-5. Adds noDateError state set true on Confirm-with-no-date, cleared on date select and successful confirm. Correct and self-contained; merges cleanly into main. Fix is NOT yet in main despite a teammate's "Already fixed" comment — main still has the buggy toast.
fix/android-50-date-toast-visibility
In Review
Unassigned
no QA note ready to merge
1 files · +14/−5
review & merge notes
Risk: Low risk. Inline Text renders inside the sheet container so it has no z-index dependency — a robust fix for the portal-occlusion bug. Text is already imported; state lifecycle is correct (set on guard, cleared on date select and confirm); button marginTop adapts 40->12 to preserve layout. Only nit: copy differs slightly from spec ("Please select an offer date" vs. original "Please select offer date") — cosmetic, not a defect. Runtime/device verification not done (gated by ANDROID-9 dev build); tsc shows no new errors, eslint clean.
Merge: Clean. merge-tree --write-tree produced a tree SHA with no CONFLICT marker; cherry shows the single commit e6386ad is not in main. Mohammed's "Already fixed" comment is inaccurate — origin/main still has the occluded Toast.show at lines 123-125, so this branch is still needed. No QA verification on the ticket; recommend on-device z-order verification (per ticket Description) before/after merge. No overlap with other tickets on this file.
Mohammed Elhatmi · 2026-06-12"Already fixed" — but this is NOT substantiated by the code: origin/main still uses the occluded Toast.show({text1: "Please select offer date"}) at lines 123-125. The branch fix is not in main. Prior comment (Vineet Kumar) describes the auto-fix: replaced toast with inline Text error, fixed-unverified, runtime verification gated by ANDROID-9.
ANDROID-51
fix/android-51-youtube-redemption-gate
In Review
Unassigned
no QA note conflicts
4 files · +30/−4
review & merge notes
Risk: The branch is STALE relative to main. git merge-tree reports a real CONFLICT in app/main/offer.tsx. The branch patches the OLD showDummyOfferAlert — a simple two-line ternary (isInstagram ? instagram_url : tiktok) — but main has since rewritten showDummyOfferAlert into an "iOS pattern" function that fetches a fresh profile and branches across 4 states (declined/missing/notApproved/pendingVerification) per platform, with only an isInstagram check and a tiktok else-branch. main's showDummyOfferAlert has NO youtube handling, so the original bug (YouTube offers falling into the tiktok `missing = !fresh.tiktok?.trim()` path, wrongly showing the Connect popup) STILL exists in main. The branch's core fix therefore targets code that no longer exists. The three helper changes (userVerification.ts isYouTubeConnected + youtube branch; offerFiltering.ts getVerificationRequirementMessage youtube branch; types/profile.ts youtube_verified) are absent from main and would apply, but they are secondary; offerFiltering's getVerificationRequirementMessage in main still has no youtube branch. The "Already fixed" dev comment is misleading: only handleVerificationCheck got a youtube branch in main, not the showDummyOfferAlert redemption gate cited as the root cause. Not QA-verified (live note: not reachable on test data); status In Review, Unassigned, unresolved.
Merge: Do not merge as-is. CONFLICT in app/main/offer.tsx: main refactored showDummyOfferAlert into a 4-state-per-platform structure that the branch's patch context (old 2-line ternary) no longer matches. Re-implement the YouTube branch on top of main's current showDummyOfferAlert — add an explicit offerSocialMediaType === "youtube" branch gating on fresh.youtube_verified === 1 (skip the Connect popup when connected) BEFORE the isInstagram/else-tiktok logic, rather than rebasing this stale commit. The helper-file additions (userVerification.ts, offerFiltering.ts, types/profile.ts) can be carried over but verify against main first since main lacks them. Note dev comment "Already fixed" only covers handleVerificationCheck, not the showDummyOfferAlert gate — the ticket's root-cause path remains unfixed in main.
Mohammed Elhatmi · 2026-06-12"Already fixed" — but this refers to the handleVerificationCheck youtube branch (offer.tsx ~line 491), which already exists in main. It does NOT cover showDummyOfferAlert, the redemption gate named as the root cause in the ticket, which is still unfixed in main.
ANDROID-52 Branch removes all 5 hardcoded user-id 54168 fallbacks in features/offers/api/offer.ts, replacing each silent fallback with a thrown 'Session expired, please sign in again' error so redemption calls abort instead of acting against a stranger's account. The change is correct and addresses the bug, but it does NOT merge cleanly: main has since advanced (commit a628f8e restructured offer.ts), so the branch's context lines no longer match and git merge-tree reports a content conflict.
fix/android-52-remove-hardcoded-userid
In Review
Unassigned
no QA note conflicts
1 files · +5/−5
review & merge notes
Risk: Correctness of the change itself is good: each of the 5 call sites had an identical anti-pattern (fall back to literal id 54168 when no userId), and throwing on missing userId is the right behavior — it stops redemption actions being sent against someone else's account. Replacing the silent fallback with a thrown error is a behavior change callers (React Query/UI) must surface, but that is the intended fix per the ticket. No tests added; ticket is static-only and no QA verification recorded. Main still contains 4 of the 54168 occurrences (one site was restructured away in a628f8e), confirming the fix is genuinely not yet in main.
Merge: Does NOT merge cleanly. merge-tree --write-tree reports CONFLICT (content) in features/offers/api/offer.ts. Root cause: main advanced via commit a628f8e ("Add/update features/offers/api/offer.ts") after the branch's merge-base (06b9088), drifting line numbers and restructuring one of the five call sites; main now has 4 literal 54168 occurrences vs the branch's old 5-site layout. Recommend rebasing origin/fix/android-52-remove-hardcoded-userid onto current origin/main and re-applying the throw at all 4 remaining 54168 sites (plus confirm the restructured site near line 425/proceedWithAcceptedOffer no longer carries the fallback). Single-file, low-complexity conflict, but must be resolved before merge.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): removed all 5 hardcoded 54168 fallbacks in offer.ts, replaced each with throw new Error('Session expired, please sign in again'). Verified grep 54168=0, no new TS errors (131 baseline unchanged), ESLint clean. Runtime not tested (static-only ticket). Branch fix/android-52-remove-hardcoded-userid, commit bcf8d3f.
ANDROID-53 Branch migrates the license_alert_shown flag from AsyncStorage to SecureStore via new storage.ts helpers and rewires home.tsx + authStore.logout. The fix is correct and addresses the root cause, but main has independently edited the same license block in home.tsx, so it no longer merges cleanly.
fix/android-53-first-launch-license-alert
In Review
Unassigned
no QA note conflicts
3 files · +83/−17
review & merge notes
Risk: The fix is correct and well-targeted. getLicenseAlertShown/setLicenseAlertShown/clearLicenseAlertShown use SecureStore (mobile) / localStorage (web), matching the rest of the app's persistence; getLicenseAlertShown fails open (returns false -> shows alert) on read error, and home.tsx adds a .catch that also fails open, directly fixing the original bug where AsyncStorage.getItem could reject and silently suppress the alert. clearLicenseAlertShown is added to clearAllAuthData so the flag resets on logout, and the redundant AsyncStorage.removeItem was removed from authStore — state is now unified in one store. All three AsyncStorage references in home.tsx are replaced (none left); the second useEffect (niche alert) also uses the new helper consistently. Minor: setLicenseAlertShown swallows write errors silently, so a failed write could re-show the alert next launch, but that is fail-safe (annoying, not broken). Not runtime/QA verified on a fresh install — the comment explicitly skipped emulator verification, and the only Jira live-test note is a PARTIAL observation, so behavior on true first-launch state is unconfirmed.
Merge: Does NOT merge cleanly: git merge-tree reports a CONFLICT in app/main/(tabs)/home.tsx. Main commit 0bc2080 separately rewrote the same license-alert block (moved LICENSE_ALERT_SHOWN_KEY to module scope, switched to await AsyncStorage.getItem) while this branch rewrote it to SecureStore helpers — overlapping edits collide. storage.ts and authStore.ts apply cleanly. Resolve the home.tsx conflict by taking the branch's SecureStore-helper version (getLicenseAlertShown/setLicenseAlertShown + fail-open .catch) and discarding main's AsyncStorage edits. Main still uses AsyncStorage for the license flag, so the fix is genuinely not yet in main. Recommend rebasing the branch onto current origin/main and re-validating home.tsx after conflict resolution.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added getLicenseAlertShown/setLicenseAlertShown/clearLicenseAlertShown in storage.ts (SecureStore), wired into clearAllAuthData, swapped AsyncStorage usages in home.tsx with a fail-open .catch, removed AsyncStorage.removeItem from authStore logout. TSC delta 0, ESLint clean. Emulator/fresh-install verification NOT performed (too risky on shared emulator).
ANDROID-54 Branch adds an 8s safety timeout + ActivityIndicator to the first-run auth gate in app/index.tsx (1 file, +20/-2, 1 commit). The commit is NOT in main (git cherry shows '+'). However, main has since been rewritten by the dev: the entire isCheckingAuth/checkAuthStatus pattern the branch patches no longer exists, replaced by a reactive Zustand subscription (isInitialized/isAuthenticated) with AnimatedSplashScreen owning initializeAuth() and a splashDone gate using <Redirect>. merge-tree reports a content CONFLICT on app/index.tsx. The branch is both conflicting and functionally superseded.
fix/android-54-auth-gate-timeout-loader
In Review
Unassigned
no QA note conflicts
1 files · +20/−2
review & merge notes
Risk: The branch fix is well-formed in isolation (clears timeout in finally and via useEffect cleanup, correct loader styling), but it targets code that no longer exists in main. Main's commit 1909e6f removed isCheckingAuth and checkAuthStatus entirely, moving initializeAuth() ownership to AnimatedSplashScreen and using a reactive store subscription + splashDone gate. The blank-screen concern is now handled differently: index.tsx intentionally returns null while the splash overlay is still on screen (not actually blank). Applying this branch would reintroduce a duplicate/competing auth-check loop and a setTimeout against state that no longer drives the gate. High confidence: conflict and supersession both verified directly.
Merge: Do not merge as-is. Hard content conflict on app/index.tsx (merge-base 06b9088 vs main 2ecd29e diverged). Superseded by dev rewrite in main commit 1909e6f ('Add/update app/index.tsx') which replaced the isCheckingAuth gate with a reactive Zustand/splashDone model. Recommend closing the branch and re-validating the original blank-screen risk against the new architecture; if a safety timeout is still wanted it must be reimplemented in AnimatedSplashScreen/authStore, not in index.tsx. Confirm with the dev who landed 1909e6f.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): replaced `return null` with centered ActivityIndicator and added an 8s safety timeout that forces setIsCheckingAuth(false) if initializeAuth() hangs. TSC delta zero (133->133), eslint clean. Static verification only; loader path not runtime-tested. Branch fix/android-54-auth-gate-timeout-loader, commit 7114967.
ANDROID-55 Bug fix reorders authStore.logout() so SecureStore credentials are wiped (clearAllAuthData) and in-memory auth state is reset unconditionally and FIRST, before any isLoggingOut bail guard. Bail guards retained only on non-critical FCM/Intercom/modal cleanup. useLogout now awaits authLogout() before router.replace navigation. Storage failures are now logged via console.error instead of being silently swallowed. Branch has 1 commit, not in main, merges cleanly.
fix/android-55-logout-wipe-credentials-first
In Review
Unassigned
no QA note ready to merge
2 files · +58/−47
review & merge notes
Risk: Change is correct and tightly scoped to the ticket. The root cause (credential wipe buried after FCM unregister and gated behind isLoggingOut bail checks, so a fast re-login or storage error could skip it) is fixed: clearAllAuthData() and the in-memory reset both run unconditionally at the top. Bail guards correctly remain only on best-effort side effects. useLogout awaits authLogout() before navigating, so the "navigate before wipe" race is closed. Storage errors are now logged rather than swallowed (ticket asked for Sentry; console.error is a partial fulfillment — acceptable but not ideal). Low risk: 2 files, no API/signature changes. Note ticket mentioned app/index.tsx fromLogout auth-skip and storage.ts but those were not touched — the unconditional disk wipe makes the fromLogout skip safe, so this is reasonable. Not runtime/QA verified (emulator regression skipped, no human verification on the ticket).
Merge: Clean — merges into main with no conflicts (merge-tree produced a clean tree). No overlap detected with other launch tickets on these files. Recommend a manual logout->relogin and logout->kill->relaunch smoke test before release since the only verification on record is the unverified auto-fix bot; consider upgrading the console.error on storage-wipe failure to a Sentry capture per the ticket's stated fix.
Vineet Kumar · 2026-06-12Auto-fix bot comment (fixed-unverified): restructured authStore.logout() to wipe SecureStore + reset in-memory auth state unconditionally at top before bail guards; useLogout now awaits authLogout() before navigation. TSC/ESLint clean, emulator regression skipped. No human/QA verification.
ANDROID-56 Branch addresses both parts of the ticket in a single file (OtpInputsProfile.tsx). The fragile 150ms setTimeout focus race is replaced with InteractionManager.runAfterInteractions() with proper task.cancel() cleanup — correct RN idiom. The inactive (pre-verify) state now renders a greyed/disabled style (disabledContainer: grey bg, muted border, 0.6 opacity), tapping while inactive shows a Toast instead of silent no-op, and the active focused cell gets a distinct teal focusedContainer. editable={isActive} and the isFocused&&isActive cursor gating are intentionally preserved (the field staying non-editable until verify is intended; the bug was the lack of visible feedback, now fixed). Merges clean into main, single commit not yet in main.
fix/android-56-profile-otp-focus
In Review
Unassigned
no QA note ready to merge
1 files · +39/−6
review & merge notes
Risk: Low risk. Change is scoped to one component, additive styling plus UX feedback. Logic is correct: InteractionManager focus is properly cancelled on cleanup; disabled/focused styles are pure presentation. One external dependency to confirm at integration: it now calls Toast.show from react-native-toast-message, which requires a Toast root provider mounted in the app (if not present, the toast silently no-ops but does not crash). Cursor visibility under New Arch (a ticket open question) is unchanged by this diff and not verified here. No QA verification on Jira yet — comment explicitly flags runtime QA was not done in CI and needs manual device testing on the Profile OTP screen.
Merge: Clean — merge-tree --write-tree produced a tree with no CONFLICT markers; cherry shows the single commit (7942812) is not in main. No overlap with other tickets in this file. Before/at merge, confirm a react-native-toast-message provider is mounted at app root so the "Verify your email first" toast renders. Recommend manual QA on Profile OTP screen (Profile -> Personal details -> change phone/verify) before closing, since no QA sign-off exists.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): replaced 150ms setTimeout with InteractionManager.runAfterInteractions (cancelled in cleanup); added greyed disabledContainer when !isActive; Toast "Verify your email first" on tap-when-inactive; teal focusedContainer styling. TSC delta zero (131->131), ESLint clean. Runtime QA not done in CI — needs manual device QA. Commit 7942812.
ANDROID-57 Migrate login + profile-OTP off Fabric-incompatible react-native-keyboard-aware-scroll-view to react-native-keyboard-controller. Single commit (da42b27), 3 files, +5/-11. Branch not in main, merges cleanly, no conflicts. Change matches ticket spec exactly and reuses the proven signUp.tsx pattern.
fix/android-57-keyboard-controller-migration
Done
Unassigned
no QA note ready to merge
3 files · +5/−11
review & merge notes
Risk: Low risk and correct. Import swapped to react-native-keyboard-controller's KeyboardAwareScrollView, the same component already used in signUp.tsx on main. Unsupported props (enableOnAndroid, enableAutomaticScroll, extraScrollHeight, resetScrollToCoords) correctly removed; OTP's extraScrollHeight={50} correctly remapped to bottomOffset={50}. The critical layout fix is sound: login.tsx keyboardScrollView height:600->flex:1 PLUS innerContainer flex:1 (a flex:1 child in an auto-height parent would collapse to 0 and itself cause a blank login, so the parent flex:1 is necessary and present). Legacy pure-JS dep removed from package.json (no native rebuild needed). No lingering legacy imports remain. Residual risk: profile/otp.tsx runtime path was not exercised on-device (only login+signUp verified), and the only verification claim is from the fix author rather than an independent QA signoff. Note the ticket's own live-test stated the bug was NOT reproduced on the dev build, suggesting it may be intermittent/build-dependent; the fix is still correct regardless.
Merge: Clean. Merges into main without conflicts (merge-tree produced a tree with no CONFLICT marker). Self-contained: only touches login.tsx, profile/otp.tsx, package.json - no overlap with other in-flight tickets. After merge, run a package manager install to drop react-native-keyboard-aware-scroll-view from the lockfile. Recommend a quick manual pass on the profile email-change OTP screen since that runtime path was not exercised on-device.
Vineet Kumar · 2026-06-12Auto-fix bot comment (same author as the fix, not an independent QA person) claiming FIXED & QA-VERIFIED on emulator. Swapped KeyboardAwareScrollView to react-native-keyboard-controller on login + profile OTP, dropped unsupported props, height:600->flex:1, removed legacy dep. Static checks clean; emulator login+OTP rendering confirmed. Did not exercise profile/otp runtime path.
ANDROID-58
fix/android-58-signup-route-casing
Done
Unassigned
QA rejected ready to merge
1 files · +0/−0
review & merge notes
Risk: Fix is correct and minimal. Branch is a pure git mv of app/auth/signUp.tsx -> app/auth/signup.tsx (diff shows similarity index 100%, 0 insertions/0 deletions). Verified on origin/main the file is still signUp.tsx (capital U) while _layout.tsx:213 (Stack.Screen name="auth/signup"), index.tsx:195 and login.tsx:392 (router.replace("/auth/signup")) all use lowercase. Expo Router is case-sensitive, so the rename makes the file match the references — exactly resolving the unreachable-route bug. Single-file rename, no logic change, very low risk. Note: the Jira "Done" status is stale/incorrect — the fix lives only on the branch, never merged (merge-base --is-ancestor confirms adcc3c8 is NOT in main), so the shipping code on main is still broken.
Merge: Clean. merge-tree --write-tree produced a tree with no CONFLICT against origin/main. Single commit adcc3c8, single-file rename, no overlap with other tickets. Branch is not yet in main (ANCESTOR-NO). Action: merge fix/android-58-signup-route-casing into main and re-verify Sign Up navigation on a real Android build; this unblocks the Maestro signup E2E suite. The board's "Done" is premature until merged.
Vineet Kumar · 2026-06-18BLOCKING: marked Done but still live on main (re-confirmed on-device 2026-06-18). Sign Up still navigates to "Unmatched Route" — main still has app/auth/signUp.tsx (capital U) while index.tsx/login.tsx call /auth/signup. Fix commit adcc3c8 exists on branch but is NOT merged. Breaks Maestro E2E signup flows. Ask: merge the branch or reopen.
ANDROID-59 ANDROID-59 asks to confirm the Google Cloud OAuth consent screen for the production client ID is Published/Verified for the sensitive youtube.readonly scope (used by the signup YouTube-connect flow), or to drop the scope if YouTube connect is not needed at v1 launch. No code branch exists and none is expected — the work is a Google Cloud Console verification process, not a repo change. Ticket remains To Do, Unassigned, unresolved.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: This is a real launch blocker but not a code task. An unverified OAuth app requesting the sensitive youtube.readonly scope shows an 'unverified app' warning and is capped at 100 users, which would block real launch usage. The gate lives in Google Cloud Console (consent screen publishing/verification, brand verification, scope justification), not in alist-android. The only repo-side decision is whether to keep or drop the scope at YouTubeConnectButton.tsx:43 — if YouTube connect is not required for v1, dropping the scope removes the verification dependency entirely. Note related ANDROID-51 (fix/android-51-youtube-redemption-gate) touches YouTube redemption logic; coordinate the connect/scope decision with that work.
Merge: Nothing to merge — no branch, no code change. Action is operational/external: complete Google Cloud OAuth verification for the production client ID, OR make a product decision to drop youtube.readonly for v1 and remove it from YouTubeConnectButton.tsx:43 (that removal would be a separate code ticket). Requires human with Google Cloud Console access; cannot be resolved by the auto-fix pipeline.
Vineet Kumar · 2026-06-12Auto-fix triage — BLOCKED (needs human). Google OAuth verification for youtube.readonly is a Google Cloud Console process (brand verification, scopes justification), not code. Scoped out of the auto-fix pipeline since fixes are restricted to the alist-android repo; needs console/account access or a human decision.
ANDROID-60 ANDROID-60 (crash reporting/Sentry + root error boundary + global JS handler) is unstarted: live Jira status To Do, Unassigned, no resolution, no fix branch. It is explicitly blocked on a human decision (Sentry org account + DSN) per the 2026-06-12 triage comment.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: P1 release-blocker that is genuinely unaddressed — no code exists. Risk is real: per the ticket, RootLayout has no top-level error boundary (only 3 feature-scoped ones) and no global ErrorUtils handler, so any uncaught render error white-screens the app with zero telemetry, compounded by pervasive silent catch blocks. Day-one production failures would be invisible. The Sentry DSN portion is blocked on an external account/console decision, but the root ErrorBoundary in _layout.tsx and ErrorUtils.setGlobalHandler + unhandledrejection listener are pure in-repo work that could ship independently of Sentry to at least prevent white-screens.
Merge: Nothing to merge — no branch, no commits, not in main. Blocked: provision a Sentry org account + DSN (human/console decision) before the Sentry wiring can be done. Consider splitting: the in-repo error boundary + global handler can be implemented now without the DSN. Touches app/_layout.tsx, app.json, eas.json, package.json, core/state/authStore.ts, features/offers/components/ErrorBoundary.tsx; the authStore login/logout user set/clear may overlap with other auth tickets (e.g. logout/credential and login-crash work) — coordinate if those land first.
Vineet Kumar · 2026-06-12Auto-fix triage marked BLOCKED (needs human): Sentry requires an org account + DSN decision before code can be wired. Once a DSN exists this is a 1-2h code task (@sentry/react-native). Scoped out of auto-fix pipeline because it needs backend/console/account access or a human decision.
ANDROID-61 Branch (1 commit, 374b909) cleanly removes EXPO_PUBLIC_INTERCOM_TOKEN from all 6 eas.json profiles and removes the dead `token` field + getEnvVar call from config/environment.ts (8 deletions, 0 additions). The security-critical part is already done in main: main's commit 8a62a67 ("eas") already deleted the INTERCOM_TOKEN line from eas.json (git grep finds zero occurrences in origin/main). However main did it messily — the token line was merged into the APP_ID line with broken indentation. Because main and the branch edit the same eas.json lines, merge-tree reports a CONFLICT. The environment.ts cleanup is NOT yet in main (origin/main still has `token: string;` at line 15 and the getEnvVar("INTERCOM_TOKEN") call), so that dead-code removal is genuinely additive and worth keeping.
fix/android-61-remove-intercom-token
In Review
Unassigned
no QA note conflicts
2 files · +0/−8
review & merge notes
Risk: Low code risk: pure deletions of a dead config field (auto-fix audit confirms zero runtime call sites; corroborated — nothing in main references intercom.token either). The real residual risk is operational, not code: the leaked Intercom server Access Token is a read/write credential still present in git history. Removing it from working files (already done in main for eas.json) does NOT mitigate the breach — the token must be REVOKED/rotated in Intercom and history purged (BFG/filter-repo). This branch does neither and cannot. No QA verification on the ticket; assignee Unassigned.
Merge: Does NOT merge cleanly: merge-tree reports CONFLICT in eas.json because main commit 8a62a67 already removed the same INTERCOM_TOKEN line (messily, breaking indentation) while the branch removes it cleanly. Recommended path: do NOT merge this branch as-is. The eas.json security fix is already in main, so only the config/environment.ts dead-code cleanup is missing — cherry-pick just that hunk (or re-apply on top of current main) rather than merging the whole branch. Also fix main's broken `+"EXPO_PUBLIC_INTERCOM_APP_ID"` indentation introduced by 8a62a67. CRITICAL out-of-band: revoke the token in Intercom and purge git history regardless of any merge decision.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): removed EXPO_PUBLIC_INTERCOM_TOKEN from all 6 eas.json profiles and removed dead `token` field from config/environment.ts. Usage audit found zero call sites (dead code). Verified JSON valid, grep clean, TS error count 131 unchanged. Flags CRITICAL human action: token must be REVOKED in Intercom and purged from git history regardless of merge.
ANDROID-62
fix/android-62-strip-console-release
In Review
Unassigned
no QA note conflicts
8 files · +21/−51
review & merge notes
Risk: The fix is correct and high-value: babel.config.js adds babel-plugin-transform-remove-console for env.production (exclude 'error'), the actual mechanism that strips ~97 console.* from release bundles — and this is NOT yet in main. The preset is resolved via expo's package.json path to survive a non-hoisted node_modules layout (sensible). formHandler.ts correctly deletes the signup DEV-OTP log and re-gates the login OTP toast on __DEV__ instead of the broken baseUrl.includes('dev-') heuristic (which was true in prod) — the key security correctness win. auth.ts/profile.ts/OfferVoucher manual log deletions are clean and apply without conflict. Requires npm install after pull (new devDependency). Note Mohammed's comment contends the logging is intentional for testing — but gating on __DEV__ preserves dev-time visibility while stripping release, so the fix accommodates that concern. No correctness defects found.
Merge: Does NOT merge cleanly: merge-tree reports CONFLICT in features/auth/api/signup.ts and features/venues/api/venue.ts because main has moved since the branch was cut. The dev independently removed the sensitive logs in BOTH conflicting files in main: signup.ts connectYoutube no longer logs request data/serverAuthCode/response body, and venue.ts no longer logs RAW VENUE REVIEW DETAILS (the venueLoggedCalls dedup set remains but its console.log is gone; main also refactored the import to getTokenOrLogout). So the branch's signup.ts and venue.ts edits are largely SUPERSEDED by dev work in main. Recommended path: rebase the branch onto current main, dropping/auto-resolving the signup.ts and venue.ts hunks (take main's versions), and keep ONLY the still-missing pieces — babel.config.js, package.json devDependency, formHandler.ts (__DEV__ OTP gate + removed Environment import), auth.ts, OfferVoucher.tsx, profile.ts. The babel/transform-remove-console change is the load-bearing item not yet in main and must land. The other 4 clean files apply directly. After rebase: run npm install. No QA verification recorded; status In Review.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi (dev): "This is for debugging purposes as we are testing, all measures will be taken once app is ready to be published." Pushback on the fix, not a QA verification. Prior comment is the bot auto-fix report. No QA sign-off.
ANDROID-63 ANDROID-63 is an infrastructure/process task to ensure production builds use an EAS-managed upload keystore plus Play App Signing instead of the checked-in debug keystore (android/app/build.gradle:112-115 sets release signingConfig to signingConfigs.debug). It remains To Do, Unassigned, unresolved. No fix branch exists. Last comment (Vineet Kumar, 2026-06-12) marks it BLOCKED/needs-human: the fix lives in the EAS dashboard and Play Console, not in repo code, so it was scoped out of the auto-fix pipeline.
To Do
Unassigned
no QA note no branch
review & merge notes
Risk: P1 release blocker that is genuinely a deployment/config concern, not a code bug a branch can resolve. The build.gradle release config points at the debug keystore, but EAS prebuild overrides signing with managed credentials, so the real risk is only if someone builds prod locally from the checked-out android/ folder (would ship a debug-signed, Play-rejected APK). Verification requires confirming a non-debug upload keystore exists in the EAS dashboard and that Play App Signing is enrolled — both outside the repo. No QA signal present. Correctly classified as needing human/console action.
Merge: Nothing to merge: no branch, no code change. This is a console/dashboard task (EAS upload keystore + Play App Signing enrollment) that must be done by a human with org-level eas login and Play Console access. Keep build.gradle prod builds going through EAS only; do not build prod locally. No conflict surface with other tickets.
Vineet Kumar · 2026-06-12Auto-fix triage marked BLOCKED (needs human). Upload keystore / Play App Signing lives in the EAS dashboard + Play Console (requires eas login as the org); no code change can fix it. Scoped out by auto-fix pipeline since fixes are restricted to the alist-android repo and this needs console/account access.
ANDROID-64 Branch adds EAS remote version management: cli.appVersionSource="remote" and production autoIncrement=true in eas.json (4 additions, 1 file). Implements the recommended option from the ticket. app.json android block correctly has no hard-coded versionCode, so no conflicting source of truth. Diff is non-empty and not in main (cherry shows "+"). merge-tree returns a clean tree with no CONFLICT.
fix/android-64-version-management
In Review
Unassigned
no QA note ready to merge
1 files · +4/−0
review & merge notes
Risk: Correct and complete for the stated goal. cli.appVersionSource="remote" delegates the versionCode counter to EAS, and autoIncrement=true on the production profile bumps it per build, eliminating Play Store duplicate-versionCode rejections. JSON is valid and there is no competing android.versionCode in app.json. Low risk. Minor unrelated note: production buildType is "apk"; Play Store prefers "aab", but that is out of scope for this versionCode ticket and not a defect introduced here. Ticket description also asked to add an owner to app.json; that was not done, but it is non-blocking for the versionCode fix.
Merge: Clean. Single isolated commit (9b4caed) touching only eas.json; merges cleanly into main with no conflicts and no overlap with other tickets. Safe to merge as-is. Still In Review with no QA verification and Unassigned, so treat as dev-verified-only pending reviewer/QA approval.
Vineet Kumar · 2026-06-12Auto-fix attempt (fixed-unverified): added cli.appVersionSource="remote" top-level and autoIncrement=true on production profile in eas.json; app.json android block left without hard-coded versionCode (correct for remote source). Static JSON validation only, no QA sign-off.
ANDROID-65 Single-commit branch removes the `android.buildType: "apk"` block (3 lines) from the production profile in eas.json, leaving preview/preview4 APK profiles untouched. The code change is correct for its stated goal — with that block gone, EAS Build defaults production to app-bundle (.aab), which Play requires. It merges cleanly into main (merge-tree produced a tree with no CONFLICT). However, the last Jira comment from stakeholder Mohammed Elhatmi explicitly says to keep APK for now because the team is still testing, so this should not be merged yet despite being technically sound.
fix/android-65-production-aab
In Review
Unassigned
no QA note needs work
1 files · +0/−3
review & merge notes
Risk: Code is correct and low-risk in isolation: only the production.android.buildType:'apk' block is removed; preview/preview4 APK side-load profiles are unchanged, and EAS defaults production to app-bundle. Diff is +0/-3, valid JSON. The real risk is process/product, not code: the most recent comment (Mohammed Elhatmi) explicitly states the team must stay on APK during current testing, so merging now would break the team's test/distribution workflow. Separately (pre-existing, not introduced here), the production profile's EXPO_PUBLIC_API_BASE_URL points to dev-api.alist.ae — worth confirming before any production AAB is actually published, but out of scope for this diff.
Merge: Merges clean into origin/main (no conflicts). Do NOT merge yet: hold pending stakeholder sign-off. Last comment from Mohammed Elhatmi (2026-06-12) explicitly asks to keep APK while testing; the AAB switch is intended only for the publishing milestone. Re-evaluate once the team moves from the testing phase to Play publishing. Ticket remains In Review and Unassigned with no resolution and no QA signal.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "We need to stick to apk right now as we are testing, this is for publishing." Stakeholder is explicitly deferring the APK->AAB switch; they still rely on APK builds during the current testing phase. Prior comment was the auto-fix bot marking it fixed-unverified.
ANDROID-66 Branch changes only the production profile in eas.json: sets EXPO_PUBLIC_API_BASE_URL from https://dev-api.alist.ae/v1 to https://api.alist.ae/v1 and adds EXPO_PUBLIC_VENUE_IMAGE_BASE_URL=https://creator.alist.ae/assets/uploads/venues/. Dev/preview profiles untouched. Single commit ae06c6a, merges cleanly into main, fix is not yet in main.
fix/android-66-prod-api-url
In Review
Unassigned
no QA note needs work
1 files · +2/−1
review & merge notes
Risk: Change is correctly scoped: only the production profile (eas.json line 80) is modified; all 5 dev/preview profiles remain on dev-api.alist.ae. Setting EXPO_PUBLIC_VENUE_IMAGE_BASE_URL is necessary because environment.ts falls back to dev-creator.alist.ae when unset. Mechanically clean and low-risk to the file. The real risk is value correctness, not code: the prod URLs (api.alist.ae/v1, creator.alist.ae/assets/uploads/venues/) were sourced from HTTP probes per the dev's own comment and were never confirmed with backend, and there is no QA/runtime verification of a prod build. Reviewer Mohammed Elhatmi's "Correct apis as we are still developing" further signals the prod values are not yet endorsed. No QA sign-off (qaSignal none). Cannot be marked ready until backend confirms the canonical prod hosts and a prod build verifies traffic.
Merge: Merges cleanly into main (merge-tree produced a tree with no CONFLICT; no overlap with other tickets). Single-file, single-commit change. Do NOT merge as-is: block on backend confirmation of the canonical prod API + venue image base URLs and address reviewer Mohammed Elhatmi's comment; ideally verify with a prod AAB that runtime traffic hits api.alist.ae before merging. Once values are confirmed, this is a trivial clean merge.
Mohammed Elhatmi · 2026-06-12Mohammed Elhatmi: "Correct apis as we are still developing." Reads as a reviewer concern that prod URLs may be premature / need correcting since the product is still in active development. Prior comment was the auto-fix attempt (Vineet Kumar) flagging the URLs were sourced from HTTP probes and must be double-confirmed with backend before a prod build.
ANDROID-67
fix/android-67-review-comment-crash
In Progress
Preji John
QA verified ready to merge
1 files · +11/−3
review & merge notes
Risk: Low-risk, correct, minimal fix. Single-file change: swaps the plain RN TextInput for @gorhom/bottom-sheet's BottomSheetTextInput in features/offers/components/CommentInput.tsx — the standard New-Arch/Fabric fix for inputs mounted inside a gorhom sheet. forwardRef type updated to React.ComponentRef<typeof BottomSheetTextInput>; all props are drop-in compatible. QA (Preji John, 06-16) explicitly confirmed the crash is resolved. IMPORTANT: that same QA comment reports a SEPARATE regression — after submitting a review the offer disappears from the History page. This branch touches no submit/history logic, so it neither causes nor fixes that regression; it remains open and should be tracked before the ticket is closed. The home/ duplicate Vineet flagged does not exist on main, so that heads-up is moot.
Merge: Clean — merges into main with no conflict (merge-tree produced a tree, no CONFLICT). 1 commit (3dcbf3d), not yet in main. Safe to merge the crash fix on its own. However, do NOT close ANDROID-67 on merge: a QA-reported regression (review submission removing the offer from History) is still open and is out of scope for this branch — track/fix separately. The flagged features/home/components/CommentInput.tsx duplicate is not present on main, so no companion change is needed.
Vineet Kumar · 2026-06-17Vineet (06-17): AI-assisted root cause + branch. Plain RN TextInput inside a @gorhom/bottom-sheet sheet crashes on focus under New Arch (Fabric); fix swaps it to BottomSheetTextInput in features/offers/components/CommentInput.tsx (commit 3dcbf3d, pushed not merged). Flagged a possible home/ duplicate. Prior comment Preji John (06-16): crash resolved, but new regression — submitting a review removes the offer from the History page.
ANDROID-68 Bug: Cancel Event for Dine-Out offer in the History page Invite section fails with an error. Board and live Jira both show status "QA Verified", assignee Preji John, resolution unset. No fix branch exists in the repo and no comments are present on the ticket.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Status discrepancy: ticket sits in "QA Verified" (statusCategory In Progress, resolution=null) yet there is no fix branch and zero comments documenting the fix or QA pass. There is no code artifact to evidence the cancel-event fix, and no QA comment from Preji John or anyone confirming verification. The "QA Verified" label is therefore unsubstantiated by any traceable change. Cannot assess code correctness because no branch/diff exists to review.
Merge: Nothing to merge — no fix branch found. Locate the commit/branch that implements the cancel-event fix (or confirm it landed via another ticket) before considering this work part of the launch. Do not treat "QA Verified" as merge-ready without an associated code change.
ANDROID-69 ANDROID-69 (Bug): History page → Invite section does not auto-update after cancelling a Dine-Out event via the Remove button; the cancelled event remains visible until manual refresh or re-navigation. Live Jira status is "QA Verified", assignee Preji John, resolution unset, last updated 2026-06-16. No fix branch exists in the repo and the Jira issue has zero comments, so there is no code to review and no QA sign-off trail to corroborate the board status.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Cannot assess code correctness: no fix branch exists in alist-android, so nothing to diff or review. The bug is a state-management/UI-refresh issue (stale list after a remove/cancel mutation) — typically a missing list invalidation or state emission after the cancel call. Status reads "QA Verified" but resolution is unset and there are zero comments on the ticket, so there is no evidence trail (no QA author, date, or pass/fail note) backing the verified status. Treat the QA-verified label as unsubstantiated until the corresponding code change is located.
Merge: No branch to merge. The fix is either not yet pushed, was committed under a different ticket reference, or has already landed in main as part of another change. Before release, locate where the Dine-Out cancel/remove refresh fix actually lives (search main history for History/Invite list invalidation after cancel) to confirm the QA-Verified status corresponds to real, merged code. No conflicts to flag.
ANDROID-70 ANDROID-70 is a Bug ("Error Displayed on Clicking 'Connect YouTube Channel'") in live Jira status "QA Verified", assignee Preji John, resolution unset, last updated 2026-06-16. No fix branch exists in the repo and the ticket has zero comments, so there is no code to review and no QA sign-off comment to corroborate the board status.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Status discrepancy: the board shows "QA Verified" yet no fix branch exists and the ticket carries zero comments and no resolution. There is no traceable code change implementing or verifying the YouTube-connect error fix, and no QA evidence (no comment from Preji John or anyone confirming a pass). The "QA Verified" label is therefore unsubstantiated from a code/audit standpoint. Possible the fix landed directly on main via another ticket/commit, but that cannot be confirmed here since branch review was skipped per instructions.
Merge: Nothing to merge — no fix branch. Before trusting the "QA Verified" status, locate the actual code change: search origin/main history for a commit referencing ANDROID-70 or the YouTube connect flow to confirm the fix is already in main, and obtain explicit QA confirmation since Jira has no verifying comment and resolution is unset.
ANDROID-71 ANDROID-71 is a Bug: after redeeming an offer, the Android app navigates to the Upload tab instead of staying on the Voucher tab. Live Jira shows status "QA Verified", assignee Preji John, resolution unset, last updated 2026-06-16. There is no fix branch and zero Jira comments, so no QA sign-off text and no code to review.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Cannot assess code correctness: no fix branch exists, so the actual navigation fix (likely a post-redemption routing/tab-index change) cannot be inspected. The board/Jira status of "QA Verified" is unsupported by any comment trail (zero comments) and resolution is null, so the "verified" claim cannot be corroborated from Jira and qaSignal is "none." Status category is still "In Progress" (indeterminate), which is inconsistent with a fully verified/closed bug. Treat the QA Verified label with caution until a branch or commit implementing the fix is located.
Merge: No branch to merge. Nothing in flight for this ticket. Before launch, confirm whether the navigation fix was delivered under another ticket/branch or already landed on main; if not, this bug is unaddressed in code despite the QA Verified status. No conflicts to flag.
ANDROID-72 ANDROID-72 (Bug: Image thumbnails not displayed during review upload) is marked "QA Verified" on the board, but the live Jira shows a contradicting state: no fix branch exists in the repo, resolution is null, and the only/last comment (Preji John, QA, 2026-06-16) states "Still same. Please check" with a reproduction video — meaning QA actually re-confirmed the bug still occurs. The "QA Verified" status appears stale/mis-set and should be treated as not actually verified.
QA Verified
Preji John
QA rejected no branch
review & merge notes
Risk: Status mislabeling risk is high. Board says "QA Verified" yet the latest QA comment (Preji John, 2026-06-16) explicitly reports the thumbnail issue still reproduces, and resolution is null with no fix branch present. There is no code to merge and, more importantly, the underlying bug is apparently unresolved. Treating this as launch-ready would ship a known, QA-confirmed defect. Recommend reopening / kicking back to the developer (Mohammed Elhatmi) for an actual fix before launch.
Merge: Nothing to merge: no fix branch exists for ANDROID-72 and the bug is still reproducing per QA. Do not treat as done. Re-assign to dev for an actual fix, then re-run QA before flipping status. The "QA Verified" board status is not trustworthy here and conflicts with the live Jira comment history.
Preji John · 2026-06-16Preji John (QA) to Mohammed Elhatmi: "Still same. Please check (video: still-thumbnail-issue)" — QA re-tested and the thumbnail bug still reproduces, indicating the fix did not resolve the issue.
ANDROID-73 ANDROID-73 (Bug): Photo Library not accessible despite media permissions enabled. Live Jira status is "QA Verified", assignee Preji John, resolution unset, last updated 2026-06-16. The issue describes that even with Files/Media permissions allowed, users cannot select images from the photo library. No fix branch exists in the repo, so no code review was possible.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Board and live Jira both show "QA Verified", but there is NO fix branch and NO commits associated with this ticket, and the Jira resolution field is still null with zero comments. There is no traceable code change implementing the fix, and no QA comment documenting what was verified or how. This is a verification gap: a permissions/photo-picker bug marked QA Verified with no linked code and no resolution recorded. Cannot confirm any actual fix landed; treat as unverified at the code level until a branch/commit or merged change is identified.
Merge: No branch to merge — nothing to integrate from this ticket. Before treating ANDROID-73 as launch-ready, locate the actual code change (it may have been folded into another branch/commit or a shared photo-picker/permissions change) and confirm it is in origin/main. If no change exists in main, the "QA Verified" status is not backed by mergeable code and the ticket should be re-examined.
ANDROID-74 ANDROID-74 (Bug): "Select Category" UI should match iOS design. Live Jira status In Progress, unresolved, assigned to Preji John. No fix branch exists. QA (Preji John) has rejected the work three consecutive days (6/16, 6/17, 6/18), most recently confirming the UI issue is still not resolved.
In Progress
Preji John
QA rejected no branch
review & merge notes
Risk: Not ready by any measure. No fix branch exists, so there is no code to review or merge. QA has actively rejected the attempted fix three times in a row (6/16-6/18), with the latest 6/18 comment confirming the UI still does not match iOS and an earlier 6/17 comment noting an error appearing in the Select Category flow. Status remains In Progress with no resolution. This is an open, regressing bug, not a launch-ready item.
Merge: Nothing to merge — no branch. Do not include in the Android launch cut. Bug is still open and failing QA; fix work (likely owned by Mohammed Elhatmi per comment mentions) must be completed and pass QA verification before any merge. Re-evaluate once a branch exists and QA signs off.
Preji John · 2026-06-18Preji John (QA) to Mohammed Elhatmi: "The reported UI issue is still not resolved. (video: Category-UI)". This follows two prior same-day-range comments (6/16: "Still same, please check"; 6/17: "showing an error, please check") — QA has rejected the fix three times running.
ANDROID-75 Fix registers the missing auth/Congratulations route in the root Stack (app/_layout.tsx) with animation slide_from_right, matching the existing auth/login and auth/signup screens, so tapping Signup "Done" slides the Congratulations screen in from the right instead of using Android's default transition. The change is correct and minimal, but main has since restructured/reindented the same region of app/_layout.tsx, so merge-tree reports a textual CONFLICT in app/_layout.tsx. Congratulations is NOT yet registered in main. PM (Mohammed Elhatmi) has commented suggesting the ticket be dismissed as not worth fixing.
fix/android-75-signup-done-transition
In Progress
Vineet Kumar
no QA note conflicts
1 files · +8/−0
review & merge notes
Risk: Change is logically correct and low-risk in isolation: it adds one Stack.Screen entry (presentation card, animation slide_from_right, gestureEnabled false) consistent with sibling auth screens, and addresses the stated root cause (route missing from the navigator so it fell back to the default transition). No logic touched beyond navigation config. Main does not yet contain this route, so the fix is still needed. Caveat: PM comment recommends dismissing the ticket entirely; product decision may override merge.
Merge: Does NOT merge cleanly — merge-tree --write-tree reports CONFLICT (content) in app/_layout.tsx. Conflict is contextual, not logical: main has reindented and restructured the Stack block (e.g. removed ShimmerProvider wrapper, changed comments/indentation) in the same region. Reapply the 8-line auth/Congratulations Stack.Screen block manually onto main's current layout (insert between the auth/signup and main screens) and re-test. Also resolve the product question first: PM suggested dismissing ANDROID-75; confirm with product before merging.
Mohammed Elhatmi · 2026-06-17Mohammed Elhatmi: opinion to dismiss the ticket — a very minor transition-style difference vs iOS, fixing it isn't worth the hassle at this stage. (Prior comment was Vineet's auto-fix note describing the root cause and branch.) No QA verification present.
ANDROID-76 ANDROID-76 (Bug) is In Progress with no resolution and no fix branch. Latest QA comment from Preji John (2026-06-16) confirms push notifications now work but the notification badge/count indicator is still missing on the icon — the bug is only partially resolved.
In Progress
Preji John
QA rejected no branch
review & merge notes
Risk: Two-part bug. Per QA (Preji John, 2026-06-16) the push-notification half is now functioning, but the badge/unread-count indicator on the notification icon is still not displayed, so the second symptom remains unfixed. Ticket is correctly still In Progress with no resolution. Nothing is verified-passed; the remaining badge work is not done.
Merge: No branch exists for ANDROID-76, so there is nothing to merge. Outstanding work is the notification badge/unread-count indicator on the icon. Do not include in the launch cut until a fix branch is created, the badge indicator is implemented, and QA re-verifies. No conflicts to assess.
Preji John · 2026-06-16@Mohammed Elhatmi Push notifications are working correctly, but the notification badge (indicator/count) is not shown on the notification icon, making it hard for users to identify new/unread notifications. References iOS and Android badge videos.
ANDROID-77 ANDROID-77 fix branch adds timeout/error/foreground safeguards to the splash gate but (1) conflicts with current main on AnimatedSplashScreen.tsx and (2) was rejected by QA (white screen still visible, only shorter). Status Reopen, assignee Vineet Kumar. Needs rebase + a deeper root-cause fix.
fix/android-77-79-splash-gate-hang
Reopen
Vineet Kumar
QA rejected conflicts
1 files · +45/−1
review & merge notes
Risk: Single-file change to shared/components/feedback/AnimatedSplashScreen.tsx adding three safeguards: 4s soft cap (mark video complete), 7s hard cap (force-dismiss + hideAsync + onFinish), AppState foreground-resume, and status==="error" handling to release the gate on decode failure. The logic correctly prevents an infinite hang. HOWEVER it treats the symptom, not the root cause: the soft/hard caps merely time-bound the white splash rather than ensuring content is ready, which matches QA's 2026-06-18 finding that the white screen still appears, just shorter. The softCap effect depends on [onFinish] but reads hasVideoCompleted/hasFinished without listing them as deps; the hardCap closure captures stale state but uses the hasFinished ref so it stays correct. AppState handler force-sets hasVideoCompleted on every foreground, which could prematurely end the splash animation on a normal resume. Overall: functional safety net, but does not resolve the reported defect.
Merge: Does NOT merge cleanly: git merge-tree reports a content CONFLICT in shared/components/feedback/AnimatedSplashScreen.tsx against current origin/main — main has diverged on this file since the branch was cut, so it must be rebased/re-resolved before any merge. Commit bfad472 is not in main (cherry shows +). Branch is shared with ANDROID-79 (same splash gate, minimize case) so the two must be resolved together. Beyond the conflict, QA has reopened the ticket (white screen still visible per Preji John 2026-06-18), so even after rebasing this should not ship as a fix for ANDROID-77 without addressing the residual white screen / actual content-readiness root cause.
Preji John · 2026-06-18QA (Preji John): In the latest build a white screen is still visible when opening the app; duration decreased vs previous build but the bug persists. Video attached (white-screen). This is why the ticket sits in Reopen.
ANDROID-78 ANDROID-78 (Bug) reports a noticeable delay loading pages when tapping bottom tab bar icons; the issue note states the delay is not clearly visible in the screen recording. Live Jira status is "QA Verified" with assignee Preji John, resolution unset, and zero comments. No fix branch exists in the repo, so no code review was possible.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Performance/UX bug about tab-switch latency. Status sits at "QA Verified" but resolution is null and there are zero comments documenting what was tested, how the delay was measured, or what the fix was. The original report itself flags the delay as hard to observe, which makes "QA Verified" hard to trust without recorded evidence (e.g., trace/frame timings). No code artifact exists to confirm any change was actually made. Risk that the status was advanced without a verifiable fix.
Merge: No fix branch exists for ANDROID-78, so there is nothing to merge. Before relying on the "QA Verified" status, locate the actual code change (it may have landed directly on main under a different reference or via another ticket) and request QA evidence/comments documenting the measured latency improvement. Treat as not-mergeable until a branch or merged commit is identified.
ANDROID-79 The ANDROID-79 minimize-during-launch hang is already fixed in main by a superior dev-authored implementation. The branch commit bfad472 is NOT an ancestor of origin/main and does NOT merge cleanly (CONFLICT in shared/components/feedback/AnimatedSplashScreen.tsx). Main already has an AppState-driven resume path plus a safety timeout that addresses this exact scenario, and does so more carefully than the branch. Jira status is "QA Verified" but no comment explicitly confirms QA retested the minimize-during-launch case.
fix/android-77-79-splash-gate-hang
QA Verified
Preji John
no QA note already in main
1 files · +45/−1
review & merge notes
Risk: Branch adds an AppState "active" listener that resumes the player and force-sets hasVideoCompleted on EVERY foreground event, plus 4s soft / 7s hard timeout caps. Main already solved this better: it uses wasVideoPausedByBackgroundRef so it resumes ONLY on a genuine background-to-foreground transition during the splash, avoiding spurious play() calls during Android's startup AppState sequence, and a single 12s safety timeout. Main also handles the video error status (ANDROID-77) inline. Merging the branch would regress main's more careful background-detection logic and introduce a too-aggressive "complete on any active" behavior plus duplicate/overlapping timeout logic. The fix the ticket asks for is present and correct in main already.
Merge: Do NOT merge this branch. Superseded by dev work already in origin/main (commits f6dee20 / 1e646f0 / f592abe on shared/components/feedback/AnimatedSplashScreen.tsx). Branch commit bfad472 is not in main and conflicts on the same file; main's implementation is more robust. Close/abandon the branch. If anything, verify on-device that the minimize-during-launch scenario passes against current main; no Jira comment confirms QA retested this specific case despite the "QA Verified" status.
Vineet Kumar · 2026-06-17AI-assisted root cause: same splash completion gate as ANDROID-77. Backgrounding mid-play pauses expo-video, which never auto-resumes, so playToEnd never fires and the gate never releases (app frozen on reopen). Proposed fix: AppState "active" listener to resume + release gate, plus timeout backstops. Branch fix/android-77-79-splash-gate-hang commit bfad472, pushed not merged; needs on-device verification.
ANDROID-80
Reopen
Preji John
QA rejected no branch
review & merge notes
Risk: No fix branch exists, so there is no code to review or merge. The ticket is in active dispute: QA (Preji John) reopened on 2026-06-18 with "Still same (video: not-refresh)", indicating the auto-refresh-on-navigate-back issue is still reproducible on QA's device. The developer counters that the behavior is an intentional "silent refresh" matching iOS (list updates in place without a skeleton reload) and that it works in his own testing of the offer-cancel flow. This is a behavioral/expectation mismatch rather than a confirmed code defect: QA may be expecting a visible refresh indicator while the implementation refreshes silently, OR there is a genuine device/timing-specific bug where the silent refresh does not fire. Unresolved (resolution=null). Not launch-ready until QA re-verifies against the video evidence.
Merge: Nothing to merge — no fix branch was published for ANDROID-80. The relevant code changes (if committed at all) live somewhere not surfaced here; none are on a named fix branch. Before any merge consideration, QA (Preji John) and dev (Mohammed Elhatmi) must reconcile the expectation gap on the "silent refresh" behavior and QA must re-verify against the not-refresh video. Note the dev also extended the silent-refresh pattern to the notifications screen, so any eventual fix touches both offer listing and notifications screens.
Mohammed Elhatmi · 2026-06-18Dev (Mohammed Elhatmi) defends the fix: it is a "silent refresh" matching iOS — list updates without retriggering skeleton loading. He says cancelling an offer and navigating back correctly drops the "redeemed" status, and confirms he also applied the same silent refresh to the notifications screen. Earlier comment by QA (Preji John, 2026-06-18 14:00) reopened it: "Still same (video: not-refresh)".
ANDROID-81 Single-commit fix (66f15f0) for the redeemed-offer crash. It replaces the render-time router.replace(backLink) call in app/main/offer.tsx with the same redirect inside a useEffect (keyed on shouldRedirectAway, backLink), returning null until it fires. The fix is correct and targets the exact bug, but main has diverged on offer.tsx so it will not merge cleanly.
fix/android-81-redeemed-offer-redirect-crash
QA Verified
Preji John
no QA note conflicts
1 files · +13/−3
review & merge notes
Risk: The fix is technically sound and directly addresses the root cause: main still contains the original buggy block (// Redirect silently only when loading is finished and data is still missing. / if (!isLoadingOfferData && !apiOfferData?.data) { router.replace(backLink); return null; }) which calls router.replace during render and crashes on the New Architecture. The branch moves this into a useEffect with correct dependency array; useEffect is already imported. Low correctness risk. Caveat: despite board status "QA Verified", there is NO QA sign-off comment in Jira (only the dev/AI root-cause note), and the comment itself flags that on-device verification (redeem -> cancel -> reopen) was still pending. So the "QA Verified" status is not corroborated by any QA evidence in the ticket.
Merge: Will NOT merge cleanly. git merge-tree reports CONFLICT (content) in app/main/offer.tsx because main has diverged on this file (commits 48bc60f, 270ed41 added unrelated content, shifting the redirect block from ~line 1470 to ~line 1651). The fix region itself is not contested logically — main still has the old buggy block and the branch has the new useEffect version — but a textual merge collides. Recommend rebasing the branch onto current origin/main (or re-applying the small 13/-3 change by hand at offer.tsx ~line 1651) and resolving by taking the branch's useEffect-based redirect. After rebase, re-run merge-tree to confirm clean. Also obtain actual QA on-device verification before merging, since the ticket has no QA sign-off comment.
Vineet Kumar · 2026-06-17AI-assisted root cause + proposed fix. Identifies the render-time router.replace(backLink) in offer.tsx (~line 1470) as the crash cause (navigation during render on New Architecture); proposes moving it into a useEffect. Branch/commit 66f15f0 pushed, not merged. Notes it still needs on-device verification (redeem -> cancel -> reopen). No QA sign-off comment present.
ANDROID-82
QA Verified
Preji John
QA rejected no branch
review & merge notes
Risk: Board says "QA Verified" but the live Jira evidence contradicts it. The single (and latest) comment is from the QA engineer Preji John on 2026-06-16 stating "Still same" with a reproduction video and specific test accounts — i.e. the Intercom user-name bug was still reproducing after the last fix attempt. Resolution is unset (null) and status category is "In Progress" (yellow), not Done. No fix branch exists in the repo (the only intercom branch, fix/android-61-remove-intercom-token, belongs to ANDROID-82's unrelated sibling ANDROID-61). So there is no code to verify and active QA evidence that the bug persists. The "QA Verified" board status appears mislabeled/stale.
Merge: Nothing to merge — no fix branch exists for ANDROID-82. Do NOT treat as launch-ready despite the "QA Verified" label: latest QA comment (Preji John, 2026-06-16) reports the bug still reproduces. Reopen/return to In Progress, implement the Intercom name-fetch fix, then re-run QA against athil@cmail.com and nova@cmail.com per the QA comment before considering for the Android launch.
Preji John · 2026-06-16Preji John (QA) to Mohammed Elhatmi: "Still same." Bug reproduced after fix attempt. Asks to test with users athil@cmail.com, nova@cmail.com; references video "still-intercom".
ANDROID-83 ANDROID-83 (Bug): the "Claim Offer" button briefly flickers/glitches during offer selection. Live Jira status is "QA Verified", assignee Preji John, resolution unset (null), last updated 2026-06-18. The issue has zero comments. No fix branch exists in the repo — branch list jumps from fix/android-81-* directly to fix/android-84-*, with nothing referencing android-83. Step 2 code review was skipped accordingly.
QA Verified
Preji John
QA verified no branch
review & merge notes
Risk: Cosmetic/visual-only defect (transient button flicker on selection); no functional or data-integrity risk and low severity. However there is NO code to validate: no fix branch, no commits, and no QA comment trail despite the "QA Verified" board state. Resolution field is null, so even though the workflow status reads QA Verified, the ticket is not formally resolved and no change set can be traced. Cannot confirm any fix was actually implemented or merged — the QA-Verified status is unsupported by any visible branch, commit, or comment evidence.
Merge: Nothing to merge: no fix branch exists for ANDROID-83. Before treating this as launch-ready, locate the actual fix — it may have landed directly on main as part of another ticket's branch (e.g. an offers/claim-button UI commit) or be unimplemented. Recommend confirming with Preji John which commit corresponds to this QA-Verified bug, since there is no branch, no comments, and resolution is unset.
ANDROID-84 ANDROID-84 white-screen fix is already addressed in main via a divergent rewrite; branch conflicts and is superseded. No QA sign-off recorded despite QA Verified board status.
fix/android-84-white-screen-before-offers
QA Verified
Preji John
no QA note already in main
1 files · +18/−14
review & merge notes
Risk: The branch's one-file change (app/index.tsx) defers the two awaited network calls (initializeDeviceToken, testSignupPending) to after router.replace so the index route stops rendering null/white. The change itself is correct and low-risk in isolation. BUT main has since been rewritten by the dev: index.tsx is now a video-splash screen that derives shouldGoHome from auth-store state, calls initializeDeviceToken() fire-and-forget (.catch) at line 56, and no longer calls testSignupPending() or blocks on these calls at all. The white-screen-causing await pattern no longer exists in main, so the fix is effectively already implemented there. Board says QA Verified, but the only Jira comment is the AI root-cause note from Vineet Kumar — no QA person (Preji John) recorded a verified/passed result, so qaSignal=none.
Merge: Do NOT merge. merge-tree reports CONFLICT in app/index.tsx because main diverged: the branch was cut from old base b0bedaf, while main (latest 1909e6f) completely rewrote index.tsx into a video-splash flow. The fix is superseded by main's dev work — main already calls initializeDeviceToken fire-and-forget and dropped the blocking testSignupPending await. Close/abandon the branch; the underlying defect appears resolved in main. Recommend confirming with on-device cold-launch as a logged-in user before closing the ticket, since no QA sign-off is recorded.
Vineet Kumar · 2026-06-17AI-assisted root cause + proposed fix. Root cause: index.tsx awaited initializeDeviceToken() and testSignupPending() before router.replace('/main/home'), rendering null (white screen) until both resolved. Fix: navigate immediately, run both fire-and-forget. Branch c087c2b pushed, not merged. Needs on-device verification. No QA sign-off present.
ANDROID-85 ANDROID-85 (cosmetic Apply-button flicker on applied dedicated offer) is "QA Verified" in both board and live Jira, assigned to Preji John, but has no fix branch, no resolution set, and zero comments — so there is no code to merge and no documented QA evidence. Status should be reconciled with the assignee before launch.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Live Jira confirms status "QA Verified" (assignee Preji John, type Bug, resolution still null). However the issue has ZERO comments, so there is no documented QA evidence (no tester sign-off, no reproduction/verification note) supporting the "QA Verified" board state. The bug itself is a low-severity cosmetic UI glitch: the "Apply" button briefly flickers when tapping an already-applied dedicated offer. No fix branch exists anywhere (local or origin) for this ticket, so there is no implementation to review and nothing to ship. A "QA Verified" status with no code, no resolution, and no comment trail is inconsistent and should be reconciled before relying on it for launch.
Merge: Nothing to merge — no fix branch exists (local or remote) for ANDROID-85. The flicker is in the dedicated-offer Apply-button area, which overlaps the offer-status/dedicated-offer code touched by fix/android-41-offer-status-single-source and fix/android-49-surface-dedicated-offer-errors; if a fix is later authored it should be coordinated with those branches. Recommend confirming with assignee Preji John whether a fix was actually made/merged elsewhere or if the status was set prematurely, since resolution is unset and no QA comment exists.
ANDROID-86 ANDROID-86 (Bug): Voucher and Upload tabs should be disabled after a dedicated offer is approved, to prevent further actions. Live Jira status is QA Verified, assignee Preji John, resolution unset, with zero comments on the issue. No fix branch exists in the repo, so no code review was possible.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Cannot assess code correctness: there is NO fix branch and NO commits to review. The board shows QA Verified, but the Jira issue has zero comments, so there is no documented QA evidence (no tester sign-off, no test steps, no reopened/failed signal). Resolution is unset (null), which is inconsistent with a genuinely QA-verified/closed-out bug. Net: the status appears advanced manually with no traceable code or QA artifact backing it.
Merge: Nothing to merge — no fix branch exists for ANDROID-86. Before this ticket can be considered launch-ready, locate or create the actual code change (disable Voucher/Upload tabs on approved dedicated offers), push it on a branch, and attach QA verification evidence in Jira. Do not treat the QA Verified board status as merge-ready while the branch is absent.
ANDROID-87 ANDROID-87 (Bug, "Home page does not reset to top after navigation") is live status Reopen, unresolved, assigned to Preji John. Latest QA comment reopens it: the home page restores the prior scroll position with visible scrolling that hurts UX. No fix branch exists in the repo, so there is nothing to code-review or merge.
Reopen
Preji John
QA rejected no branch
review & merge notes
Risk: Bug is unresolved and actively reopened by QA. The reported behavior is that returning to the home page restores the previous scroll position instead of resetting to top, and the corrective auto-scroll is visible and jarring. Root cause is almost certainly scroll-state restoration / list state being retained across navigation (e.g. a saved LazyList/RecyclerView scroll position or cached page state). No fix code exists yet to assess, so correctness cannot be verified. This is a UX-facing launch-quality issue rather than a crash/data risk.
Merge: Nothing to merge — no fix branch exists. Needs a developer (Mohammed Elhatmi per the comment) to implement a fix that resets home scroll position on navigation back without a visible jump (reset before first frame / on re-entry). Re-review once a branch is pushed.
Preji John · 2026-06-18Preji John (QA) to Mohammed Elhatmi: the page auto-scrolls back to the previous position, and the visible scrolling negatively impacts UX. Asks if anything can be done (refs video: scroll-back).
ANDROID-88 Single-commit branch (e51a086) adds a null guard to the OTP-verify success branch of handleLoginContinue in shared/utils/formHandler.ts: coalesces finalToken = (data.data ?? {}).token ?? data.token and returns early with an error Toast if no token, preventing both the TypeError on undefined data.data and the tokenless-session white-screen. Jira ANDROID-88 is In Progress, assigned to Vineet Kumar, unresolved, with only an AI auto-fix comment and no QA verification. The fix is correct in isolation, but main has since been independently rewritten on the SAME success branch (FCM moved to background, generateTestFCMToken removed), so merge-tree reports a real CONFLICT — the branch cannot apply cleanly.
fix/android-88-login-crash
In Progress
Vineet Kumar
no QA note conflicts
1 files · +18/−2
review & merge notes
Risk: The fix itself is correct and low-risk in isolation: it addresses the documented root cause (unguarded data.data.token causing a TypeError, and a tokenless authStore.login causing a post-login white-screen). Notably, main's current code STILL does `const otpToken = data.data.token;` with no guard, so main has NOT fixed this crash on its own — the fix is genuinely still needed. Risk is in integration, not correctness: the branch was cut from merge-base 06b9088 where the success branch still contained the inline FCM block and generateTestFCMToken; main refactored that entire block away, so the branch's diff context no longer exists and a clean apply is impossible.
Merge: Does NOT merge cleanly — git merge-tree reports CONFLICT (content) in shared/utils/formHandler.ts. Main commits 3409fe3 / 1f54913 / d80eaa1 rewrote handleLoginContinue's OTP-verify success branch after the branch point (merge-base 06b9088): FCM registration moved to a fire-and-forget block, generateTestFCMToken removed, variables renamed finalToken/finalUserId -> otpToken/otpUserId. The branch edits the very lines main rewrote, so the comment's claim of disjoint lines vs ANDROID-90 is moot — the conflict is with main's own login rewrite, not ANDROID-90. Do not attempt a mechanical merge. Re-implement the null/token guard on top of current main: insert an `if (!otpToken) { Toast error; return; }` check before `authStore.login(otpToken, ...)`, and use `(data.data ?? {}).token ?? data.token` for the token. Keep In Progress; no QA verification yet, so on-device verification is still pending regardless.
Vineet Kumar · 2026-06-17AI auto-fix note (by Vineet Kumar): root cause is unguarded data.data.token in handleLoginContinue OTP-verify success branch — TypeError when data.data is undefined, or tokenless session when token missing (intermittent). Fix coalesces token from data.data.token ?? data.token and returns early with a Toast if no token. Branch fix/android-88-login-crash commit e51a086, pushed not merged. Notes it touches same function as ANDROID-90 (claims disjoint lines), left In Progress pending on-device verification. No QA/human reply.
ANDROID-89 Single-commit fix (f3d95bb) for the offers-list loading flicker, touching OffersList.tsx and Offer.tsx. The changes are correct and well-reasoned but do NOT merge cleanly: main has concurrently refactored OffersList.tsx, producing a content conflict. The fix is not yet in main and has no QA sign-off.
fix/android-89-offers-list-glitch
In Progress
Preji John
no QA note conflicts
2 files · +27/−53
review & merge notes
Risk: The fix itself is technically sound. OffersList.tsx: guards the skeleton with `&& transformedOffers.length === 0` so refetch/pull-to-refresh keeps existing cards (RefreshControl spinner only), and removes dead FlashList v2 props plus the bad overrideItemLayout(200px) that forced a reflow jump — correct for FlashList v2 which auto-measures. Offer.tsx: replaces the manual ActivityIndicator (transition=0, re-toggled on every recycle) with an expo-image transition=250 crossfade and adds a useEffect that resets imageError/retryCount on bannerImage change so a recycled cell can't show the fallback for a good image — sound recycling hygiene. Low correctness risk in isolation. Main still contains all the original buggy code, so the fix has NOT been superseded. Remaining risk is purely the merge conflict and the lack of the on-device visual verification the author flagged as still pending.
Merge: CONFLICT in features/home/components/OffersList.tsx (merge-tree reports content conflict; Offer.tsx auto-merges clean). Cause is concurrent active development on main's OffersList.tsx — main has removed props (profileData, displayedCount, totalCount), changed the OfferCardSkeleton import to @features/offers/components/OfferCardSkeleton, added new redeem-status handling (offer_status===2 / Not Deliverable), and stripped perf monitoring — none of which overlaps the flicker fix but all of which sits in the same file regions. Must be merged together: re-apply the ANDROID-89 changes (skeleton guard `&& transformedOffers.length===0` in renderHeader, removal of estimatedItemSize/overrideItemLayout/removeClippedSubviews/maxToRenderPerBatch/updateCellsBatchingPeriod/windowSize/estimatedListSize) on top of main's current OffersList.tsx, then keep Offer.tsx as-is. merge-tree --write-tree supported (no flag issue). Do not merge as-is. No QA verification present — only the author's AI auto-fix comment; on-device visual check vs iOS reference still pending per the comment.
Vineet Kumar · 2026-06-17AI auto-fix note (moved to In Progress). Identifies 3 flicker causes: skeleton swapped over live data on refetch, per-card image pop-in via manual ActivityIndicator with transition=0 on FlashList recycle, and dead FlashList v2 props + overrideItemLayout pinned at 200px vs ~233px real cards. Branch f3d95bb pushed, not merged. Left In Progress pending on-device visual check vs iOS reference video.
ANDROID-90 Branch's primary fix (navigate immediately after OTP, FCM registration moved to background fire-and-forget) is ALREADY implemented in main's handleLoginContinue — main even uses a more robust approach (registerForPushNotificationsAsync vs the branch's generateTestFCMToken). The branch conflicts with main on formHandler.ts. The only unique, NOT-in-main contribution is the authStore.login() change making intercomLoginIdentified fire-and-forget; main still awaits that network round-trip inside login(), so a small slow-path remains.
fix/android-90-otp-slow-nav
In Progress
Preji John
no QA note conflicts
2 files · +44/−38
review & merge notes
Risk: Code itself is correct and low-risk in isolation: void async IIFEs for FCM and Intercom are sound fire-and-forget patterns, setToken/saveToken exist on both refs, and local SecureStore writes stay awaited so the in-session token is set before home makes authenticated requests. The real risk is staleness: the formHandler half of this branch is superseded by main (which already navigates immediately and backgrounds FCM, using a better push-token source). Merging the branch as-is would either conflict or, if force-resolved toward the branch, regress main by reintroducing generateTestFCMToken (a test/placeholder token) over main's registerForPushNotificationsAsync. The genuinely valuable piece is the authStore Intercom de-blocking, which main has not yet adopted.
Merge: Do NOT merge this branch wholesale — it CONFLICTs with main in shared/utils/formHandler.ts (merge-tree --write-tree reports CONFLICT (content)). Main already contains the immediate-navigation + background-FCM fix via a different, stronger implementation (registerForPushNotificationsAsync), so the formHandler change here is obsolete and would regress to a placeholder FCM token if applied. Recommendation: drop/abandon the formHandler portion; cherry-pick only the authStore.ts change (make intercomLoginIdentified fire-and-forget inside login()) on top of current main, since main still awaits Intercom and that blocking call is the last remaining slow-path for ANDROID-90. Dev's earlier 'disjoint lines, merge together' note re ANDROID-88 is now stale — main has moved past it.
Vineet Kumar · 2026-06-17AI auto-fix note: root cause was navigation gated behind sequential FCM + Intercom network round-trips + serial Keystore writes in handleLoginContinue before onLoginSuccess. Fix moves FCM to background fire-and-forget after nav and makes authStore.login() identify Intercom fire-and-forget. Branch fix/android-90-otp-slow-nav commit 9f99fd2, pushed not merged. Warns it edits same function as ANDROID-88 (claimed disjoint lines, merge together). Left In Progress pending on-device timing check.
ANDROID-91 ANDROID-91 (Bug, "Unable to re-upload images for rejected reviews") is live-confirmed as status "QA Verified", assignee Preji John, resolution unset, with zero comments. No fix branch exists in alist-android, so no code review was possible.
QA Verified
Preji John
no QA note no branch
review & merge notes
Risk: Bug is marked "QA Verified" yet has no associated fix branch and no code change to review, so the actual fix cannot be located or validated. Resolution field is unset and there are zero Jira comments, so there is no documented evidence of what was changed or how QA verified it. The status category is still "In Progress" (yellow), not Done. Either the fix was applied elsewhere (e.g., merged directly to main, in a backend repo, or a config change) or the status was advanced without an accompanying code change. Cannot confirm the re-upload-for-rejected-reviews defect is actually fixed.
Merge: No branch to merge. Before treating this as launch-ready, locate where the fix lives: check whether it was committed directly to origin/main, lives in a separate backend/API repo, or whether the ticket was moved to QA Verified prematurely. Confirm with Preji John / QA what was verified and against which build.
ANDROID-92 ANDROID-92 (Bug) reports a missing toast notification when a user is auto-logged-out after signing in on another device. Live Jira status is "To Do", assigned to Preji John, resolution null, with zero comments and no QA activity. No fix branch exists in the repo, so there is nothing to code-review or merge.
To Do
Preji John
no QA note no branch
review & merge notes
Risk: Unimplemented bug fix. The issue describes a UX gap: the first device is logged out as expected but no toast informs the user. No code has been written (no branch, no commits), so there is no correctness risk to assess. The fix will likely touch the forced-logout/session-invalidation handling path where the toast should be surfaced. Note this is a "To Do" item with no in-progress work as of 2026-06-19.
Merge: Nothing to merge — no fix branch exists. Work has not started. If picked up, the toast should be added in the session-invalidation/forced-logout handler; verify no overlap with other login-flow tickets before merging.

Source data: _status-dashboard/data/jira-revalidation-records.json · CSV export: reports/jira-revalidation.csv. Verdicts are advisory from an automated read-only review; confirm before merging.