What it must do Functional requirements ID Requirement Priority PK-01 Sign in as a picker and go on or off duty; only approved pickers see jobs. Must PK-02 See a job feed of available, active, and today's jobs with store, distance, item count, pack-by time, and payout. Must PK-03 See same-store jobs grouped as a batch with any batch bonus. Should PK-04 Accept or decline a job; on accept it moves to the active pick and leaves other pickers' feeds. Must PK-05 Work an active pick with items grouped by aisle, showing progress and the pack-by countdown. Must PK-06 See the prepaid-card spend target for the store and record the actual amount spent, with a receipt. Must PK-07 Mark each item picked, or flag ‘can't find' to substitute or refund. Must PK-08 Substitute from suggested alternatives honouring the customer preference, ask the customer, or refund-skip. Must PK-09 Complete the pick, group items into bags (cold, fresh, bakery), and reach the handoff screen. Must PK-10 Release the order to the driver against the handoff code. Must PK-11 See earnings for today and the week, with a history of jobs and payouts. Should PK-12 Receive push notifications for new nearby jobs and approaching pack-by deadlines. Should PK-13 Keep an active pick usable through brief offline periods and sync on reconnect. Should 05 APIs it uses Picker endpoints Scope §06 API specification The picker app authenticates as a picker and calls the picker endpoints under /api/v1/picker , plus shared auth and device registration. Two of these go beyond the picker set in the main scope and are new backend work: setting on-duty status with location, and recording actual card spend with a receipt (both marked in the next section). Method Endpoint What the client uses it for POST /api/v1/auth/login Sign in as a picker; receive a JWT with the picker role PATCH /api/v1/picker/status Go on or off duty and push current location GET /api/v1/picker/jobs Job feed: available, active, today POST /api/v1/picker/jobs/{id}:accept Claim a job POST /api/v1/picker/jobs/{id}:decline Pass a job GET /api/v1/picker/jobs/{id} Job detail: items by aisle, spend target, deadline POST /api/v1/picker/jobs/{id}/items/{itemId}:pick Mark an item picked POST /api/v1/picker/jobs/{id}/items/{itemId}:substitute Record a substitution POST /api/v1/picker/jobs/{id}/items/{itemId}:refund Refund and skip an item POST /api/v1/picker/jobs/{id}:spend Record actual card spend and upload the receipt POST /api/v1/picker/jobs/{id}:handoff Release the order against the handoff code GET /api/v1/picker/earnings Earnings summary and history POST /api/v1/devices Register the push token 06 What must change in the backend Backend deltas The picker app needs the backend to treat each store leg of an order as a dispatchable job and to carry the picking lifecycle, the prepaid-card spend, the handoff, and earnings. The table lists each change and whether it is new work or an adjustment to something already scoped. Area What changes Type Roles & auth Add the picker role and an approval plus on-duty state; issue picker-scoped JWTs so only approved, on-duty pickers receive jobs. Adjust Job dispatch Turn each order's per-store leg into a claimable job with status, pack-by, payout, and optional same-store batching; claim-lock so two pickers cannot take the same job. New On-duty & location Endpoint to set on or off duty and push location, used to rank nearby jobs in the feed. New Prepaid card & spend Assign a prepaid card to a job with a spend target, and capture the actual spend and receipt at the till. New Picking state Per-item state machine (pending to picked, substituted, or refunded) driven by events from the app. New Substitutions Store proposed substitutes, the customer-preference flag, and the decision (auto or customer). New Handoff Generate and verify handoff codes and record bag grouping and the driver. New Earnings & payout Record base, tip, and batch bonus per job and expose earnings summaries. New Reconciliation tie-in Feed the captured spend and receipt into the existing reconciliation against the customer charge. Adjust Notifications Push new-job and pack-by deadline alerts to picker devices. New Reconciliation itself already exists in the scope; the picker work feeds it by capturing the actual till spend and receipt against each job, which is then matched to the customer charge. 07 Data model — picker slice Tables involved Scope §05 Data model The picker slice centres on order_stores — one row per store leg, which is the job. Around it sit the picker, the items and their substitutions, the prepaid card and captured spend, the handoff, and earnings. This is a focused view of the full model in the scope. P accounts accounts id (pk) role full_name pickers pickers id (pk) account_id (fk) status, on_duty rating accounts->pickers orders orders id (pk) account_id (fk) state accounts->orders order_stores order_stores id (pk) · job order_id (fk) store_id (fk) picker_id (fk) status, pack_by handoff_code, spend_target pickers->order_stores prepaid_cards prepaid_cards id (pk) last4 assigned_picker_id (fk) pickers->prepaid_cards picker_earnings picker_earnings id (pk) picker_id (fk) order_store_id (fk) base, tip, bonus pickers->picker_earnings orders->order_stores retailers_stores retailers / stores id (pk) code, name fulfilment retailers_stores->order_stores order_items order_items id (pk) order_store_id (fk) product_id (fk) qty, status substitution_id order_stores->order_items job_cards job_cards id (pk) order_store_id (fk) prepaid_card_id (fk) actual_spend_cents order_stores->job_cards handoffs handoffs id (pk) order_store_id (fk) code status order_stores->handoffs order_stores->picker_earnings substitutions substitutions id (pk) order_item_id (fk) substitute_product_id (fk) customer_pref status order_items->substitutions products products id (pk) name, brand products->order_items products->substitutions prepaid_cards->job_cards 08 Database to stand up Ready to run The accompanying file baskit_picker_schema.sql stands the picker database up. It creates 7 enums and 15 tables: the picker-specific tables (pickers, picker_shifts, picker_devices, prepaid_cards, job_batches, order_stores, job_cards, order_items, substitutions, handoffs, picker_earnings) plus a minimal form of the shared tables they depend on (accounts, retailers_stores, products, orders) so it runs on its own. How to run Create a fresh database and apply the schema: createdb baskit_picker psql baskit_picker -f baskit_picker_schema.sql Two things to know All money is integer cents; never floating point. Claiming a job is a guarded update: set the picker and status only where the job is still available , so two pickers cannot take the same job. This is the picker slice. When you merge it into the main backend database, keep the picker-specific tables and reconcile the four shared tables against their full definitions in the scope ERD. 09 Beta-readiness checklist Before pickers go live Picker sign-in, approval, and on-duty toggle work, and only approved pickers receive jobs. A placed order surfaces its store legs as jobs; a claim locks the job to one picker. A full pick runs end to end: pick, substitute, refund, bag, and hand off against a code. The prepaid-card spend target shows, and actual spend plus receipt are captured and reach reconciliation. Earnings for a completed job appear in the picker's today and week totals. 10 Open items Decisions to lock Picker model — employed (assignment) or gig (open claim). This drives the dispatch logic. Batch and bonus rules — when same-store jobs batch and how the bonus is set. Prepaid-card issuer — how cards are provisioned, funded, and the transaction feed retrieved. Handoff with the courier — whether the driver enters the code in a partner app or the Baskit picker app. Silicon Overdrive Prepared as a Baskit product requirements document. Reads alongside the Baskit Phase 1 Build Scope; section references point to that document. Confidential.