Where
src/components/golf/coachhelm/player/FairwayTrendBrain.tsx — the "FORM · SCORE TO PAR" card.
Evidence
IMG_4978.
The problems
- Self-contradiction in one card. The headline reads "Your scoring is sliding" (red) with all three windows (Long range / Medium / Recent) marked ↓ declining — but the footer reads "4-round hot streak · 23.5 strokes below your average" (green, positive). A card cannot credibly say the player is both sliding and on a hot streak in the same viewport. The two signals need reconciling or clearly reframing (e.g. "declining trend, but the last 4 rounds buck it").
- Implausible magnitude. "23.5 strokes below your average" is not a real per-round figure — no golfer averages 23.5 strokes better than their own average for 4 rounds. This looks like a calculation bug (summing a delta across rounds, a unit error, or comparing against the wrong baseline). Needs root-causing in the hot-streak/trend math, not just the copy.
- Cramped 3-column rows on mobile. The middle annotations ("· the real signal", "· small sample — noisy") wrap awkwardly between the "declining" label and the % column. The row layout needs to breathe or restructure at 390px.
- Em dashes in copy ("raw scoring — not course-adjusted", "small sample — noisy") — house style avoids em dashes in UI copy.
How it should behave (architecture)
- One honest verdict per card. If the long/medium windows decline but the recent 4 buck it, SAY that as a single coherent read, don't stack a red headline over a green footer.
- The hot-streak metric must be a sane per-round figure with a correct baseline; add a guard/clamp and a unit assertion so an impossible magnitude can never render.
- Restructure the window rows for 390px (label + trend on one line, annotation below, % right-aligned and never colliding).
Acceptance criteria
Where
src/components/golf/coachhelm/player/FairwayTrendBrain.tsx— the "FORM · SCORE TO PAR" card.Evidence
IMG_4978.
The problems
How it should behave (architecture)
Acceptance criteria