Engineering review · for the dev sync
The full revalidation: branch merge-readiness, the conflicts and reverts, parity gaps, the automated test pipeline, and how we converge fast.
19 Jun 2026 · Vineet + Mohammed · read-only revalidation, nothing pushed
The situation in one slide
54 fix branches across ANDROID-1…92, each scoped to one ticket, code-reviewed and emulator-checked.
A 211-commit push plus asset/UI polish that independently rewrote many of the same files.
17 branches still merge clean, 26 now conflict, and 3 fixes were reverted. One reconciliation pass fixes this.
The takeaway, not a blame: long-lived branches against a fast-moving main always diverge. The fix is a short merge cadence, not less automation.
Branch merge-readiness · 84 tickets revalidated
Clean merge-candidate set (17)
ANDROID-24 · 25 · 26 · 27 · 34 · 38 · 42 · 44 · 46 · 48 · 50 · 55 · 56 · 57 · 58 · 64 · 67
Includes launch blockers: 57 (keyboard New-Arch), 58 (signup route casing), 64 (versionCode), 25/26/27 (permissions + plist). These can land first.
Full per-ticket detail in the Jira revalidation report (status, QA, churn, risk + merge notes).
Why 26 conflict
The branches were cut before the 211-commit push. Main then rewrote the same hotspots, so a straight merge collides. The conflicts cluster in a handful of files:
| Conflict hotspot | Branches affected | Why |
|---|---|---|
shared/utils/formHandler.ts | ANDROID-62, 88, 90 | main rewrote auth/OTP handling; branches touch the same login flow |
app/index.tsx | ANDROID-13, 19, 54, 84 | boot/auth-gate refactor on main vs splash/session fixes |
features/offers/api/offer.ts | ANDROID-23, 52 | main advanced redemption API; branch removes hardcoded user-id |
app/main/offer.tsx | ANDROID-41, 51 | main refactored offer-status into a 4-state-per-platform structure |
None of these are hard problems individually. They need a person who knows the intended behaviour to pick the right side, which is exactly the merge session.
Reverts we need to decide on
Merged via PR #1, then reverted by 8f8f9ce. disappearsOnIndex is back to {-1} and the dev Object.freeze override returned. The tap-swallowing QA blocker is live again, despite the ticket being "Done".
The inset-aware tabBarStyle was clobbered by the push to a bare {backgroundColor:"white"}. No branch exists, so it must be re-applied. On Android 15 gesture-nav the tab bar is obscured again.
Reverted on purpose, an open design dispute (iOS has no cache and refetches every appear). Escalated to Subin. Decide parity intent, then close or re-do.
Action: confirm whether each revert was intentional. ANDROID-9 and 10 look unintentional and should be re-applied on top of current main.
Launch-config blockers · still on main
| Blocker | Ticket | State |
|---|---|---|
Prod points at dev-api.alist.ae; venue URL unset | 66 | present |
| Build is APK, not AAB | 65 | present |
| No versionCode / remote autoincrement | 64 | in clean branch |
| No console-strip; DEV OTP logged plaintext | 62 | present |
| signUp.tsx casing breaks route | 58 | in clean branch |
| No Sentry / root error boundary | — | present |
Hardcoded user-id 54168 in 4 redemption paths | 52 | conflict |
| Delete account → social-profile delete | 30 | present |
Fixed on main already
READ_MEDIA_IMAGES (25/26)Native build note
assembleDebug fails on :react-native-worklets ("No variants"). Stale prebuild/autolinking. Fix with expo prebuild --clean before the AAB, it blocks release too.
iOS parity · 12 domains, 204 points
Automated testing
Current state
test/automated-e2e-maestroTo make it fully green: fix the prebuild so a release build runs, then point Maestro at a seeded test account so login/OTP/redemption flows run unattended.
How we go faster
__DEV__, not a URL substring.Proposed merge plan
release/launch-rc off current main.A local reconciliation branch with the 17 clean merges is already prepared for review. Nothing has been pushed to Bitbucket.