architecture.artof.link

Mobile Companion App

The Android companion is a lightweight shopping app for Lily's Florist. It does one job on a phone: help you find, customize, and order flowers quickly.

In Plain English: You do not need a desktop workspace or a chatbot pretending to be the store. You say what you need, you pick a bouquet that is actually in stock, and you check out. The phone draws the screens. The store decides prices, stock, and orders.

The live shop is https://aea.artof.link. This page is knowledge about the phone app — not a shop route. Knowledge lives here on architecture.artof.link. The shop host does not publish /native or /framework documentation pages.

Formal IDs below already exist in docs/. They are citations, not new requirements. If this page and the workbook disagree, requirements.md and the ADRs win.

How it works · Need → Pick → Pay · Video · Honesty loop · Verified ledger · Technical audit · Privacy


How it works: a thin client

In architecture terms, a thin client shows screens and collects taps. It does not keep its own inventory, price list, or checkout rules.

The companion is a third presentation of the same store session (ADR-017, ADR-018). It talks to the same Backend-for-Frontend as the website. The phone never invents stock or totals.

Need, Pick, Pay: three steps on one store backend
Path B web workspace and the Android companion share one store backend

Need → Pick → Pay

These steps cite existing IDs. They do not add workbook rows.

  1. Need (FR-001, FR-002): Tap a suggestion (for example Mom's Birthday, Same-Day) or type your own words. Continue unlocks once the app has something useful — not only a parsed occasion keyword. Issues #401 and #402 (closed on main via !457 and !460) cover budget chips after free-text and an honest No limit label.
  2. Pick (FR-003, FR-007): Browse arrangements the store actually has. Choose one. Set how many (1–10), same as the website customize step.
  3. Pay (FR-013, FR-014, FR-018, FR-019, ADR-013): Choose a delivery window and a destination nickname, see an itemized total, then confirm. Payment on Path B is a deterministic simulation under ADR-016. Live Stripe is not claimed.

Staff fulfillment stays on the shop at /florist in a browser. That is not a second Play Store app. Contact Florist is the thin FR-006 overlay already documented in the requirements notes — FR-006 stays Future in the workbook.


See it in action (30-second video)

A 30-second recording of the app on a physical Android phone against the live store.

Watch Need → Pick → Pay: Mom's Birthday (Same-Day), budget chip, Budget Mixed Bunch, then Confirm through to Order Confirmed.

Companion Need→Pick→Pay on Android ROG, 4 September 2026, 30 seconds

This clip is a UX walk (4 Sep 2026, App Dist / packageinstaller take). It is not the Google Play install honesty proof. Play-install facts are in the verified ledger and technical audit.


The honesty loop

A website and a phone app drift if nobody checks them against each other. We use a four-step loop. A merged ticket is a claim. A probe is proof. Unprobed work stays Unknown.

Honesty loop: Detect, Decide, Ship, Prove
  1. Detect: Probe web and phone for the same totals, fees, and stock.
  2. Decide: One difference becomes one tracked issue with one owner.
  3. Ship: Fix the smallest surface that removes the mismatch.
  4. Prove: Walk it on a physical phone and the live store before anyone says it works.

Verified ledger

Plain-English status only. Device serials, versionCode dumps, and order IDs are in Technical audit. This table does not invent new prove dates.

What we askedStatusWhat that means
Installs from Google Play InternalVerified (named later builds)Play-signed, non-debug installs on the named Samsung A36 and ASUS ROG. A36 Play Internal v9 was not walked.
This page's 30s demo clipUX proof, not Play-install proof4 Sep Need→Pick→Pay→Confirmed on ROG. Not a Play honesty take.
Florist sees web vs phone ordersVerified (4 Sep 2026)Orders land on the florist dashboard with client: companion-android.
Choosable delivery window + Contact FloristVerified (4 Sep 2026)Morning / afternoon / evening. Contact Florist is the thin FR-006 overlay; workbook scope for FR-006 stays Future.
Order writes through to the shared storeVerified (4 Sep 2026)Confirm writes the same order path the website uses (FR-013, NFR-009).
Phone stores an encrypted last-order receiptWrite verifiedAfter Confirm, an Edge Wallet receipt is saved on-device (ADR-020). No street, no card number.
Need-screen Reorder → controlCode on main (!459 / #404)Shown only when a device-held receipt exists. A saved receipt is not, by itself, a button.
Play Internal reorder tap when a receipt existsVerified on ROG (9 Sep 2026)Play Internal v8 on the named ROG showed the card and walked tap → Pick.
Play Internal empty-wallet NeedAbsent (5 Sep 2026) on A36 and ROGFresh / empty wallet showed chips only. Empty-wallet ABSENT was not re-probed on 9 Sep (no pm clear).
Review wallet + Clear HistoryVerified on ROG Play Internal v9 (9 Sep 2026)Privacy lists on-device receipts; Clear History wipes them. A36 v9 was not walked. #410 / !487 shipped the code; this row is the Play-honest prove, not a reopen.
Budget chips after free-text / No limitDevice prove (A36 Play v8, 5 Sep 2026 — not ROG)#401 and #402 closed on main. Not an ROG claim.
Demo operator inbox is the billing systemNoFulfillment visibility, not a commercial ledger.
Web vs app traffic seriesVerified in codeTelemetry labels the two clients separately. Live dashboard health is not restated here.

Technical audit

For developers and reviewers who need the exact dumps. These are the same facts as the ledger above — not new proves.

1. Google Play release verification (#390)

Sideloaded early builds carried debug flags. Later Internal builds went through Google Play Internal. Play-honest v8 dumpsys on 5 Sep 2026 matches on both named handsets (A36 SM_A366B / RZCY60W1EZW, and ROG ASUS_I001DC / K9AIKN07B088C89):

versionCode=8 versionName=0.1.0-alpha.8
installerPackageName=com.android.vending
non-DEBUGGABLE
# prior Play-honest proves: ROG/A36 on versionCode 4–5; Play Internal upload also reached versionCode 7

Both v8 installs are signed and distributed by Google Play (com.android.vending) with no debug flag. On 9 Sep 2026 ~21:40 Europe/Berlin the named ROG additionally had Play Internal versionCode 9 / 0.1.0-alpha.9 (com.android.vending, non-DEBUGGABLE) — that is the #410 wallet review / Clear History prove, not an A36 v9 claim. Companion source on main remains versionCode 9 / 0.1.0-alpha.9 (#410 / !487). This session did not inspect the sponsor evidence directories (%USERPROFILE%\Temp\aea-v8\evidence\, %USERPROFILE%\Temp\aea-rog-404\, %USERPROFILE%\Temp\aea-rog-reorder-2026-09-09\, %USERPROFILE%\Temp\aea-rog-wallet-410-2026-09-09\).

2. Live order verification (#375, #384)

On 4 September 2026, live test purchases completed from the mobile app on the ASUS ROG. Latest demo recording:

3. Reorder + wallet review dumps (already published)


Shopper privacy & Edge Wallet

When you place an order, recipient labels and card-message drafts do not enter a centralized CRM of names. They stay in the phone's Edge Wallet (Android Keystore; ADR-020, ADR-018):

  1. Least data (NFR-017): The atelier receives the bouquet SKU, delivery window, and card text to print. Not a permanent address book.
  2. 1-tap reorder hint (FR-008): FR-008 stays Future in the workbook. The thin path already documented on main is: when a local encrypted receipt exists and Need is still fresh, a private card may appear ("Reorder for {recipient}" or "Reorder previous bouquet"). Tapping Reorder → revalidates current cooler stock and opens Pick with that arrangement selected. The card is not shown on an empty wallet. Play facts stay in the ledger above (9 Sep receipt-present tap on ROG; 5 Sep empty-wallet absent on both phones; empty-wallet not re-probed on 9 Sep).
  3. Review + right to be forgotten (#410): App-bar Privacy lists device-held receipts (recipient label, arrangement nickname, order ref, relative date — no street, no card PAN). Clear History wipes the on-device wallet. Physical delivery addresses at the shop are still shredded after 14 days (ADR-020). A36 Play Internal v9 was not walked.

The published privacy story on this site is Privacy-Preserving CRM. The longer operator/wallet guides live in the repository; they are not Pages routes.