Customer mobile app
Browse and search nearby listings, open details, create or improve a listing, contact or close it, and see admin status changes after refresh or sync.
Take MAL Local from a single app to a small, explainable product system: a customer mobile app, an admin website, concurrent workflows, modular boundaries, a local LLM, and production signals on mobile.
Both clients must work with the same domain concepts and demonstrate the same product state. The backend can be local, mocked, or minimal.
Browse and search nearby listings, open details, create or improve a listing, contact or close it, and see admin status changes after refresh or sync.
See dashboard counts and activity, search listings, review flags, and change operational status to active, flagged, hidden, or closed.
Lab 2 should grow from the MAL 1 marketplace work, not restart from a blank app unless the old slice cannot run.
A smaller implementation with honest evidence is stronger than a wide feature list with hidden coupling.
docs/module-map.md with dependency direction and one replacement example.docs/observability-events.md. Carry forward Lab 1 accessibility, validation, local-data privacy, and recovery expectations. Verify the integration in Measure, or document the temporary local debug sink and the final path if setup is still in progress.Use stable names and safe properties. The exact SDK API depends on your chosen mobile stack; follow the current Measure integration guide.
| Event | Trigger | Safe properties |
|---|---|---|
| customer_app_opened | App reaches usable state | version, platform |
| listing_feed_viewed | Customer feed is visible | coarse area, result count |
| listing_search_submitted | Search is submitted | query length, filter count |
| listing_create_completed | Validated listing saves | category, duration bucket |
| local_llm_completed | Model or fallback returns | feature, local/fallback, latency bucket |
| listing_contacted | Contact action is selected | listing category |
Start August 2. Submit August 15, before Lab 3. Adjust the sequence to your stack, but keep the evidence trail.
Customer/admin workflow and non-goals.
Entities, IDs, and status transitions.
Packages and dependency direction.
Feed and navigation.
Dashboard and listing views.
Repository, API, or fixture.
Parallel work and cancellation.
Stale results and failures.
Adapter and fallback.
Editable output and latency.
Events, errors, analytics.
Admin change in mobile.
ADR and implementation notes.
Fresh setup and demo.
Reviewers will run the core flows, inspect the boundaries, and check the evidence documents.
| Area | Points | What good looks like |
|---|---|---|
| Customer mobile app | 3 | Browse/search/create/action loop is usable. |
| Admin website | 3 | Real listing management and status workflow works. |
| Concurrency | 4 | Parallel work, cancellation/ownership, and tests. |
| Modular design | 4 | Replaceable data, AI, and observability layers. |
| Local LLM | 3 | Local model path, deterministic fallback, safe editable output. |
| Measure | 2 | Mobile observability, analytics, and event privacy review. |
| Documentation | 1 | Fresh setup, ADR, and evidence docs are easy to find. |
Each team should leave review with two or three concrete architecture fixes, not only a score.
| Area | What to look for | What to fix or work on |
|---|---|---|
| Product boundary | Customer and admin flows use different models, labels, or status meanings. | Create one shared contract for listing, category, neighborhood, contact preference, and status transitions. |
| Module boundaries | Screens directly call persistence, network, local model, or Measure APIs. | Move those calls behind repository, LocalLlmService, and observability interfaces. |
| Dependency direction | Admin, mobile, shared data, and AI code import each other in both directions. | Define allowed dependencies in docs/module-map.md and break cycles with interfaces or adapters. |
| Concurrency ownership | Async work updates shared state from multiple places or survives after a screen/request ends. | Add one owner for mutable state, cancellation rules, stale-result handling, and a race/cancellation test. |
| Cross-client consistency | Admin changes are not visible in mobile, or the sync path is undocumented. | Make both clients use the same repository/API/fixture and document refresh or sync behavior. |
| Local LLM boundary | Prompting, parsing, fallback, or model-runtime code lives inside UI components. | Move AI behavior into a service with typed input/output, editable results, fallback, and failure events. |
| Observability boundary | Measure calls are scattered across screens or include sensitive payloads. | Route events through one analytics boundary and document safe properties. |
| Evidence quality | Reviewers cannot understand decisions without reading all the code. | Tighten the ADR, module map, concurrency notes, and demo script. |
docs/product-slice.md, docs/concurrency-notes.md, docs/module-map.md, docs/local-llm-note.md, docs/observability-events.md, docs/success-metrics.md, and docs/adr/0002-two-client-concurrent-local-llm-architecture.md.The demo should work from a clean state and be repeatable twice.
Open the mobile app, show Measure-backed app-open/feed signals, search, and open a listing.
Improve a listing with the local LLM, disable it, and show the deterministic fallback and event.
Hide the same listing in the admin website, refresh or sync mobile, and show the status change.