<!-- Markdown mirror of https://pinflag.io/technology/strokes-gained-engine — the canonical page is the HTML URL. -->

# Strokes-Gained Engine

> Canonical: https://pinflag.io/technology/strokes-gained-engine


PinFlag’s engine implements Mark Broadie’s strokes-gained methodology on published baselines, interpolated with natural splines and guarded by a strict unit contract. The engine is frozen: its source is hash-verified in CI and every computation is stamped with that hash.


*The PinFlag iOS app is in pre-release. Leave your email and we’ll tell you the moment it’s available.*


PinFlag’s engine implements Mark Broadie’s strokes-gained methodology: published expected-strokes baselines (version 2026.4, anchored to Every Shot Counts), natural-spline interpolation, and a per-shot identity where the four categories sum exactly to the total. The engine is cryptographically frozen — its source is hash-verified in CI and every computation is stamped with that hash.


## Why it matters

- Strategy numbers are only as good as the engine pricing them.
- A frozen engine means the number you saw in June means the same thing in October.


## How it works

1. **Published baselines** — Expected strokes for every lie and distance, anchored to Broadie’s published tables — quirks preserved and pin-tested, not smoothed away.
2. **The identity** — Every shot: SG = expected(before) − expected(after) − 1 − penalty. The four categories sum exactly to the total.
3. **The freeze** — A SHA-256 hash over the engine’s modules is checked in CI; drift fails the build.


## Everything Strokes-Gained Engine does

- Broadie-verified baselines — published values, quirks preserved and pin-tested
- Per-shot identity: SG = expected(before) − expected(after) − 1 − penalty
- Four categories — OTT, Approach, Around-the-Green, Putting — sum exactly to the total
- Putting keyed in feet, everything else in yards — a guarded unit contract
- Frozen and hash-verified: the same engine on phone, server, and CI
- Round roll-ups plus a clearly-labeled estimated index — never an official handicap


## A worked example — real numbers

**One shot through the identity.** A 155-yard fairway approach finishes 25 feet from the hole. The identity prices it end to end.

- Before: 155 yd, fairway: Expected strokes 2.960
- After: 25 ft putt: Expected strokes 1.931
- The shot: Strokes gained 2.960 − 1.931 − 1 = +0.029 (A hair better than the baseline golfer — priced, not guessed.)

Every PinFlag number reduces to this arithmetic, and the app will show you the math for any shot you tap.

*Numbers computed with PinFlag’s engine (frozen SG engine, Broadie-verified baselines v2026.4, app lineage c21ee22).*


## Who it’s for

Anyone who wants to know what is under the readout before trusting it — players, coaches, and the technically curious.


## What’s different

- Verified against the published tables, including the awkward stretches other implementations smooth over.
- Frozen and hash-stamped — the engine cannot drift silently.
- Units are a contract: putting in feet, everything else in yards, tested.

## Frequently asked questions

### Is this Mark Broadie’s methodology?

Yes — the engine implements Broadie’s strokes-gained framework on his published expected-strokes baselines, and the implementation is verified against those values in tests.

### What does “frozen engine” mean?

The engine’s source files are hashed, the hash is checked in CI, and every computation is stamped with it — so results can’t drift without the change being loud and deliberate.

### Does PinFlag compute an official handicap?

No. PinFlag computes a clearly-labeled estimated index for context; it does not post scores to any handicap service.
