PROTO /course
round pending · tee 5:15p CT

COURSE FILE · SUN AUG 30 2026

Theodore Wirth Par 3

Golden Valley, MN · sunrise to sunset · walking only

27par
1,240yards
9greens
200longest · #3
SAMPLE RENDER · replaced by tonight's session
walk path shot · validated by next hit putt density green

Nine holes, nine labels

Tap a hole to zoom. Fixed tees and known yardages make a par 3 the cleanest calibration lab a wrist model can ask for.

One gate, any sport

The start motion is generic. A swing, a stroke, a serve, a lift. The same wrist gate that opens a golf session opens any session, and the workout route gives every event a place on a map like this one. What no tracker in the competitive scan can copy is what sits underneath: the blood and sleep wallet. Every session lands next to your labs and your nights, and the verdict reads all three.

The validation loop

No club sensors. No launch monitor. The course labels itself.

01

Shot at point A

The Watch detects the swing at 100 Hz. The phone stamps the position. Raw motion stays in the vault.

02

The walk is the guess

You always walk to your ball. The path terminus before the next swing is the landing estimate.

03

The next hit is the proof

Swing n+1's position is shot n's landing spot. Every shot self-labels the one before it. Distance becomes ground truth.

04

The range inherits it

Validated course shots pair wrist features with true distance. Back at the range, the Watch estimates carry with a confidence band that tightens every round.

PER-CLUB DISTANCE MODEL locked · 0 of 20 validated blocks
clubvalidated shotsest. carryconfidence
driver0awaiting rounds
iron0awaiting rounds
wedge0awaiting rounds
putter0scored surface live

Round contract

The page renders whatever the Worker serves at /api/course/round/latest. Bounded summaries only — same egress rule as /swing.

{
  "course": "theodore-wirth-par3",
  "session_stamp": "2026-08-30T22:15Z",       // coarse, rounded
  "walk": [[x, y], ...],                       // simplified polyline, meters from course datum
  "shots": [{ "hole": 1, "from": [x,y], "to": [x,y],
              "club": "7i|wedge|driver",       // classifier read or user tag
              "validated": true }],            // next-hit confirmed
  "putts": [{ "hole": 1, "from": [x,y], "to": [x,y] }],
  "gates": { "min_shot_yd": 15, "max_shot_yd": 230 }  // plausibility, same spirit as the junk gate
}