Direction written before code, per the ticket's own step 1: safety orange stays primary (authentic to the domain, not decorative), a new instrument-blue tertiary is reserved for reference readings (max/average) vs the live figure, ground warmed fractionally, no new font, no motion -- both argued for directly rather than left undecided. Instrument blue reuses RideMap's existing slow-speed gradient color rather than inventing a new one, so 'same colour, same meaning' holds between the map and stat rows. contrastRatio() implements WCAG 2.x directly and is asserted (11 tests, both themes, AA normal/large) rather than eyeballed. Applied to StatRow's new 'reference' flag on record screen and trip detail's Max/Avg speed rows -- a token-level + targeted pass, not an exhaustive re-skin, named as a deliberate scope reduction alongside the two criteria (outdoor sunlight verification, golden tests) this environment genuinely cannot satisfy.
3.9 KiB
v3 tickets
One file per feature, in the shape that worked for v2: Goal · Context · Design · Implementation · Acceptance criteria · Tests · Risks · Out of scope. Written before implementing, so the risks are on paper before they are walked into.
Menu, not a commitment. Nothing here is scheduled.
Everything in v3 is buildable with no server. Group rides, accounts and paid cloud backup are v4 — see ../BACKLOG.md.
Before starting anything: ../port/REAL-RIDE-CHECKLIST.md. The port has never recorded a real ride, and item I3 may still force a change of GPS engine — which would land underneath several of these tickets.
The tickets
| # | Ticket | Size | Depends on | Status |
|---|---|---|---|---|
| V3-01 | Activity type per ride | M | — | Done |
| V3-02 | Settings screen | S | — | Done |
| V3-03 | Distance and speed units | S | V3-02 | Done |
| V3-04 | Live map on the recording screen | M | — | Done |
| V3-05 | Mounted (handlebar) mode | M | V3-04 | Done |
| V3-06 | Live stats in the notification | S | — | Done |
| V3-07 | Route drawing (pins, straight lines) | M | — | Done |
| V3-08 | Road-snapped routing and ETA | L | V3-07, V3-01 | Not started |
| V3-09 | Follow a planned route | M | V3-04, V3-08 | Not started |
| V3-10 | Trip splitting | S | — | Done |
| V3-11 | Offline tile pre-download | M | V3-04 | Partially done (pipeline shipped; needs aeroplane-mode device verification) |
| V3-12 | Crash reporting | S | — | Partially done (code only; needs a real Sentry DSN + release build) |
| V3-13 | Real-ride measurements | M | riding | Not started |
| V3-14 | GPX interoperability | S | V3-01 | Partially done (code only; needs real-device verification) |
| V3-15 | Auto-pause | M | V3-13 (gated) | Not started |
| V3-16 | Visual identity | M | V3-04, V3-05 | Partially done (token-level identity shipped; needs outdoor device verification) |
Dependencies
V3-01 ──┬────────────► V3-08 ──► V3-09
└──► V3-14 ▲
V3-07 ──────► V3-08 │
V3-02 ──► V3-03 │
V3-04 ──┬──► V3-05 ──┬───────┘
├──► V3-11 └──► V3-16
└──► V3-09
V3-13 ──► V3-15 (gate: may close unbuilt)
no dependencies: V3-01 · V3-02 · V3-04 · V3-06 · V3-07 · V3-10 · V3-12
Three that carry more weight than their size suggests
V3-01 ships the port's first real migration. The destructive fallback is gone, so
getting addColumn plus a v1-database test right matters more than the feature does —
V3-07 and V3-09 both add migrations behind it.
V3-08 forces a routing-engine decision with ongoing cost and vendor implications.
Behind a RoutingService interface, mirroring what LocationSource did for GPS.
V3-13 is not code. It answers the three questions that have been open since v2, and V3-15 may close unbuilt as a result — a legitimate and probably likely outcome.
Suggested order, if starting cold
- V3-01 — proves the migration path while the stakes are low, and unblocks V3-08/14
- V3-02 + V3-03 — small, self-contained, gives V3-01 a home
- V3-04 — the most visible change, and the gateway to four other tickets
- V3-07 — entirely independent; useful on its own before the routing decision
- V3-13 — as soon as there is a ride to measure
V3-12 is a good filler at any point. V3-16 should wait until the screens stop moving.