Files
Thiru-tenext c3e25feaea Five payload bugs, four pages behind dead rows, and one sheet
── The full-address path was reaching the Miler empty ──

`DestinationGroup.toBookingJson` spread its details FLAT across the
destination. The contract nests them under `details{}`, and a destination
carrying keys the server does not recognise is accepted without a word — so
every building number, street, landmark, recipient name, recipient phone and
pin a customer typed was written, answered 201, and thrown away. The Miler
arrived with a district.

Four more on the same call. The destination pin spelled `latitude`/`longitude`
— the same spelling that answered 422 unserviceable for months on the pickup
before it was fixed there and missed here. A PATCH that sent `null` to clear a
field, with a comment saying so, when the server writes only non-nil values, so
a landmark could be added and never removed. Per-destination `instructions`
folded into the visit's one `remarks` line on the belief the contract had no
per-destination note; it has one. And `contactName`/`contactPhone` on the
pickup object, which the create contract has no room for and drops.

The fix ships unverified, deliberately. If `details{}` is also the wrong shape
the fields drop exactly as they do today — it cannot be worse, and holding it
costs every full-address booking in the meantime. docs/BACKEND_CHANGES.md asks
for the confirmation; tool/verify_booking.sh runs it in one command.

── Who the Miler rings ──

One number reaches the rider and it is the account's: `GET /miler/bookings`
returns a single `customerphone`, verified against production and written down
in the rider app's own stop_contact.dart. So "Someone else is handing it over?"
was collecting a number that reached nobody.

Review now shows the number that will actually be dialled, and the handover
person travels in `remarks` with a name, labelled for whoever reads it. Both
screens say plainly that the rider's call button still dials the account —
better than letting somebody hand their parcel to a neighbour believing
otherwise.

── Account's rows led nowhere ──

Two had no `onTap` at all — a chevron pointing at a page that did not exist —
and three answered with a toast. Five rows making a promise, one keeping it.

Notifications, Payment, Help and About are real screens now, written to one
rule: say only what is true of this app today. There is no notification
endpoint, no stored payment instrument and no push SDK wired in, so none of
them pretends to manage any of that. Support shows no contact block at all
rather than a number that rings nowhere — AppConfig carries the fields empty
until somebody fills them in.

── ONE TOUCH is one sheet ──

It was two in sequence with a dismissal between them, and the destination step
made you open a state to see any city — two levels of navigation for something
its own search already flattened. One flat list headed by state, which is also
the answer to "where do you deliver?", and one surface that changes its
question instead of closing so another can open.

Home says the reach in a line, and it needed two fixes to appear at all:
`cachedCities` walked closed states looking for districts that are only fetched
for open ones, and `loadCities` filled two caches while notifying nobody.

── Sending a second parcel ──

`maxDestinations` is 1 in production, so two parcels for two places means
booking twice — and that cost the whole flow twice, re-answering a door the
customer had not moved from. `startBookingFrom` carries the door, carries the
destination only when asked, and never carries the window: a slot fills up, and
a second booking pinned to one that is now full is refused at confirm with
nothing the customer can act on.

Review also says why there is no "add another destination", so a cap reads as a
limit rather than a missing button.

── Bundle ──

pubspec named its images one by one. Declaring `assets/images/` as a folder
shipped a 974 KB launcher-icon master to every customer for a file no code
opens.
2026-09-29 12:31:58 +05:30

3.5 KiB
Raw Permalink Blame History

Screens

Every screen in the app, at 390×844 @3x, with the real fonts.

These are the golden files from test/snapshots/, copied here under readable names so the set can be browsed, shared or dropped into a deck without anyone having to know what a golden is. test/snapshots/ is the source of truth — this folder is a copy, and a stale copy is worse than none, so refresh it whenever the design moves:

flutter test test/design_snapshot_test.dart --run-skipped --update-goldens
tool/screens.sh

They are rendered by the test harness rather than captured from a handset, so they are identical on any machine and need no device attached. Two consequences worth knowing: map tiles are blank, because the harness has no network and CARTO is fetched live; and the data is DevDoormileApi's, so the names, addresses and references are invented.

File Screen
00-splash-truck.png Splash · first beat What the app does, in white on the brand crimson the launcher icon opens from.
00b-splash-invert.png Splash · second beat The invert, caught halfway: the ground lightening as the truck darkens, both on one curve.
00c-splash-mark.png Splash · third beat Whose app it is. The same mark the launcher icon is cut from.
01-sign-in.png Sign in One question, one field, one button.
02-sign-up.png Create account The same shell, three fields.
03-verify-code.png Verify the code One field behind four boxes that only draw.
04-home.png Home Welcome, the pickup address, BOOK, and the live booking.
05-pickup-search.png Collect from Changing the pickup address from the Home header.
06-orders-active.png Orders · Active State, date, route, packages, reference.
07-orders-completed.png Orders · Completed Delivered orders and what they cost.
08-account.png Account Grouped rows, and the build this handset is running.
09-tracking.png Live tracking The live card, the map, the Miler, the journey rail.
10-cancel-pickup.png Cancel this pickup The one destructive action, behind a reason.
11-pickup-where.png Pickup · where Every city Doormile serves, headed by state. One list, no level to open — and the answer to "where do you deliver?".
12-pickup-when.png Pickup · when The same sheet's second question. It never leaves and never changes height.
14-send-a-parcel.png Send a parcel The route, the packages, the two commitments.
15-pickup-map.png Pickup point The map editor, and who the Miler asks for.
16-pickup-booked.png Pickup booked White tick on green. The reference and the live search.
17-receipt.png Order details What was collected, weighed, photographed and paid.

Not here yet

First-run Home — the sphere's caption and the "How it works" rail only appear for a customer with no orders, and the dev backend seeds three. It needs a flag on DevFlags to capture, which is not worth adding for a picture.