# Accounts & profiles

### TB-001 — Email/password accounts with owner and walker roles

- **Size:** M
- **Hours:** 11
- **Scope:** MVP

Email/password accounts with owner and walker roles

Size reason: M — two distinct roles plus verification and reset flows means several auth states to build and guard, not one form.

**Acceptance criteria**

- User can register with email/password and select owner or walker role at signup
- Verification email is sent and account cannot fully log in/act until verified
- Password reset flow sends email with time-limited token and allows setting new password
- Role is persisted server-side and gates access to role-specific routes/UI
- Signup with an already-registered email is rejected with a clear error

### TB-002 — Walker onboarding: bio, service area, hourly rate

- **Size:** M
- **Hours:** 11
- **Scope:** MVP

Walker onboarding: bio, service area, hourly rate

Size reason: M — a multi-step form with partial-save state and price validation across service types.

**Acceptance criteria**

- Multi-step onboarding form persists partial progress and resumes where the walker left off
- Hourly rate is validated as a positive number within allowed bounds on client and server
- Service area (postcode + radius) is captured and stored correctly
- Walker cannot appear in public search until onboarding is marked complete
- Bio field enforces min/max character length with validation errors shown

### TB-003 — Profile photo upload

- **Size:** S
- **Hours:** 5
- **Scope:** MVP

Profile photo upload

Size reason: S — image processing and storage bucket wiring is contained, no branching logic.

**Acceptance criteria**

- User can upload a JPG/PNG under the defined size limit
- Uploaded image is processed/resized and stored in the storage bucket
- Oversized or invalid file types are rejected with a clear error message
- Newly uploaded photo renders correctly on the profile page after upload

### TB-004 — Public walker profile page

- **Size:** S
- **Hours:** 5
- **Scope:** MVP

Public walker profile page

Size reason: S — mostly read-only composition of data already produced by other tickets.

**Acceptance criteria**

- Page displays bio, service area, hourly rate, photo and reviews sourced from existing records
- Page is publicly viewable without authentication
- Requesting a non-existent walker id returns a proper 404
- Edits made in onboarding/profile flows are reflected on the page after save