# TASK-008 — Order tracking from split-basket legs

**Status:** Completed
**Branch:** feature/TASK-008-order-tracking-legs
**Started:** 2026-10-13
**Last updated:** 2026-10-13

## Goal
After checkout, show the shopper one tracking card per Baskit Ops order leg (split basket), with statuses that update as pickers claim and pack each store leg.

## Acceptance criteria
- [x] Ops `GET api/v1/orders/{code}` accepts session or app key; legs include `retailer_slug`; items include `leg_id`
- [x] `PlacedOrder.legs` persisted; `refreshFromOps` merges Ops payload
- [x] `OrderTrackingScreen` uses leg statuses and polls every 15s until delivered
- [x] Trello card on Customer App list; tests for leg parse and tracking UI

## Files touched
| File | Notes |
|------|-------|
| `baskit_ops` `PlaceOrderService`, `OrderLegModel`, `Api/Orders.php` | Leg payload + session auth on GET |
| `lib/models/order.dart` | `OrderLeg`, `legsFromOps`, status labels |
| `lib/state/order_model.dart` | Merge legs on refresh |
| `lib/features/checkout/checkout_screens.dart` | Tracking UI + poll |
| `test/order_legs_test.dart`, `test/order_tracking_widget_test.dart` | Tests |

## Session log
### 2026-10-13 — Cursor
- Did: Ops GET auth + leg fields; app leg model, tracking screen, TASK-008, Trello card.
- Commits: (pending)

## Next steps
1. Deploy Ops change so production GET accepts customer session tokens.
2. Manual E2E: place split basket → open tracking → picker claims leg → status updates on refresh.
