← → / space to move · F fullscreen

Engineering review · for the dev sync

alist android
engineering review

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

alist.Internal · engineering

The situation in one slide

Two streams of work happened in parallel. We need to converge them once, cleanly.

What the audit produced

54 fix branches across ANDROID-1…92, each scoped to one ticket, code-reviewed and emulator-checked.

What landed on main

A 211-commit push plus asset/UI polish that independently rewrote many of the same files.

The result

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.

alist.02

Branch merge-readiness · 84 tickets revalidated

Where every fix branch stands vs current main

17
ready to merge
(clean vs main)
26
conflict
(need rebase)
6
needs work
6
already in main
(some reverted)
29
no branch
(open / external)

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).

alist.03

Why 26 conflict

Same files, rewritten twice

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 hotspotBranches affectedWhy
shared/utils/formHandler.tsANDROID-62, 88, 90main rewrote auth/OTP handling; branches touch the same login flow
app/index.tsxANDROID-13, 19, 54, 84boot/auth-gate refactor on main vs splash/session fixes
features/offers/api/offer.tsANDROID-23, 52main advanced redemption API; branch removes hardcoded user-id
app/main/offer.tsxANDROID-41, 51main 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.

alist.04

Reverts we need to decide on

Three fixes are gone from main, the bug is back

ANDROID-9

Bottom-sheet backdrop

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".

ANDROID-10

Tab-bar safe-area insets

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.

ANDROID-11

Offers TTL cache

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.

alist.05

Launch-config blockers · still on main

A prod build today is not shippable

BlockerTicketState
Prod points at dev-api.alist.ae; venue URL unset66present
Build is APK, not AAB65present
No versionCode / remote autoincrement64in clean branch
No console-strip; DEV OTP logged plaintext62present
signUp.tsx casing breaks route58in clean branch
No Sentry / root error boundarypresent
Hardcoded user-id 54168 in 4 redemption paths52conflict
Delete account → social-profile delete30present

Fixed on main already

  • Permissions trimmed to READ_MEDIA_IMAGES (25/26)
  • No stray AD_ID / camera / storage

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.

alist.06

iOS parity · 12 domains, 204 points

62% overall — the gaps cluster at the edges

Onboarding & bootstrap
47%
Instagram insights/charts
47%
Auth, login & session
54%
Notifications & push
55%
Invites & companions
61%
History & tracking
66%
Offers home & discovery
67%
Reviews & proof upload
68%
Offer detail & redemption
71%
Profile & social
71%
Legal, settings & location
72%
Signup & creator onboarding
74%
25 missing36 partial43 divergent99 at parityWeakest: onboarding/bootstrap, Instagram insights, auth/session, notifications.
alist.07

Automated testing

How the pipeline works, and where it stands

  1. 1
    Audit the board + codebase into structured findings (parity, blockers, test cases).
  2. 2
    Fix each on a scoped branch, verified by TypeScript + a clean Hermes export bundle.
  3. 3
    E2E with Maestro on a Pixel 10 emulator (New Arch / Fabric), boot + flow smoke.

Current state

  • App boots clean under Fabric, no redbox
  • Native debug build blocked on worklets autolinking
  • ~19 smoke flows pending (need real creds/OTP)
  • Maestro flows live on test/automated-e2e-maestro

To 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.

alist.08

How we go faster

Five changes that compound

  • Short merge cadence. Land fix branches within a day or two, before main moves. This kills the 26-conflict problem at the source.
  • One release-candidate branch. All launch work converges on one branch, not 50 floating ones.
  • QA hygiene. "QA Verified" should require a QA sign-off comment. Right now most verified tickets have none.
  • Crash reporting first. Sentry + a root error boundary so day-one failures are visible, not silent white screens.
  • Env separation. Prod must never carry dev URLs, tokens, or OTP logging. Gate dev behaviour on __DEV__, not a URL substring.
  • Don't revert silently. If a fix is intentionally reverted, note why on the ticket so it doesn't reappear as a "regression".
alist.09

Proposed merge plan

One session, one PR

  1. 1
    Cut release/launch-rc off current main.
  2. 2
    Land the 17 clean branches (blockers first: 57, 58, 64, 25/26/27).
  3. 3
    Triage the 26 conflicts together by hotspot file, pick the right behaviour, re-apply on top.
  4. 4
    Decide the 3 reverts (re-apply 9 + 10; resolve 11 with Subin).
  5. 5
    Fix build config (prod API, AAB, log-strip, Sentry, worklets prebuild), one PR for review, then signed AAB.

A local reconciliation branch with the 17 clean merges is already prepared for review. Nothing has been pushed to Bitbucket.

alist.10