agentleFS
noahowshnoahowsh/birdieapi-mcp/skills/course-fit/SKILL.md

course-fit

Skill0 starsChanged 30 days agoMITView on GitHub

Measures how a golfer has played at one tournament or one course across every year, and how much of that record is course fit rather than general form. Use when the user asks who plays well at Augusta or Pebble Beach, how a player's record at an event looks, whether course history matters, or how to blend course form with overall rating. Do not use for ranking current form on its own -- see strokes-vs-field. Do not use for how the holes of a course played -- see hole-scoring. Do not use for turning fit into a win probability -- see outright-model.

The file

Files
SKILL.md

Course Fit

Default data tool: BirdieAPI (birdieapi-tool). get_course_history (5 credits) returns a player's record at one tournament or one course across years. get_course (2) describes the course. get_ratings (2) gives the baseline.

You are an expert in separating "this player is good" from "this player is good here". Golf course history is real but noisy, and most of it is just general quality. Your job is to measure the part that is left over and say how sure you are.

When to Use

  • "How has Scottie Scheffler done at the Masters?"
  • "Who has the best record at Pebble Beach since 2010?"
  • Comparing a field's course records before a tournament
  • Deciding how much weight course history gets in a model
  • Checking whether a hot player has a poor record at this venue

When NOT to Use

  • Current form or the rating -- see strokes-vs-field
  • Hole difficulty and setup -- see hole-scoring
  • Final probabilities -- see outright-model

Commands Available

CommandWhat It DoesCredits
get_course_historyOne player at one tournament (any edition's tournament_id, every year returned) or at one course (course_id, across tournaments): finishes, rounds, vs_field, summary5
get_coursePar and yards per hole, how each hole played, for one tournament's course2
list_tournamentsFind the tournament id and course_id values1
get_ratingsThe player's overall rating for the baseline2
get_player_resultsRaw rounds if you want your own course filter5

Commands That Do NOT Exist

Not AvailableUse Instead
get_course_fit, get_fit_scoreCompute it from get_course_history and get_ratings as below
A whole field's course history in one callOne get_course_history call per player; shortlist first
get_course_stats_by_yearget_course per edition
get_course_conditions, get_weatherNot available

How It Works

Step 1: Pick tournament or course. Pass tournament_id of any year to get every edition of that event. Pass course_id to get every tournament played on that course (useful for a course that hosts different events). Get ids from list_tournaments; its courses[] lists each tournament's course_id.

Step 2: Pull the record.

get_course_history {"player_id": "9478", "tournament_id": "401580344"}

Real response (trimmed), Scottie Scheffler at the Masters:

summary: starts 7, wins 2, top_tens 5, made_cut 7, average_finish 7.9, vs_field 2.78
editions: 2026  finish 2   vs_field 3.30   rounds 70 74 65 68
          2025  finish 4   vs_field 2.68   rounds 68 71 72 69
          2024  finish 1   vs_field 4.57   rounds 66 72 71 68
          2023  finish T10 vs_field 2.01
          2022  finish 1   vs_field 4.36
          2021  finish T18 vs_field 1.23

Here vs_field is the player's average strokes versus the field per round at that event. Seven starts is 28 rounds.

Step 3: Compare with the baseline. The question is not whether 2.78 is good. It is whether it is better than he is in general. Pull his rating (or his vs_field over a comparable window):

get_ratings {"limit": 50}

A simple fit measure for player i at event e:

fit_raw = mean(event vs_field) - overall level at the time of those rounds

For a fair "overall level" use the rating as it stood before each edition (get_ratings with as_of per year), not today's rating. Using today's rating for a 2021 start leaks the future.

Step 4: Shrink. Course history is a small sample. Blend it toward zero:

fit = n_rounds / (n_rounds + k) * fit_raw

k is the number of rounds at which course history deserves half weight. Do not hard-code one. Treat k as a parameter, fit it with walk-forward-validation, and report the value used. A starting assumption of a few dozen rounds is a guess, not a finding.

Step 5: Check what the fit is made of. A record can come from the course's design (long par 5s, firm greens) or from a few hot weeks. Use get_course to profile the holes and hole-scoring to see whether the player's par-type split lines up with what the course rewards. If a course has four reachable par 5s and the player's sg_par5 is elite, that is a mechanism. A good record with no mechanism is lower confidence.

Step 6: Treat course changes as breaks. A course can be redesigned, or a tournament can move venues. courses is listed per edition; if the venue changed, split the record at the change. Do not mix.

How much does course history matter

Say what is known and what is not. In general, course-specific skill exists in golf but is small relative to general skill, which is why shrinkage is the right default. The size for a given course and tour should be measured, not assumed: run the shrinkage fit on past editions with walk-forward-validation and see whether adding fit improves out-of-sample log loss on winners or on finishing scores. If it does not, drop it.

Credit Usage

OperationCreditsNotes
One player's record at one event5
Ten-player shortlist50
Whole field of 90450do not; shortlist by rating first
Baseline ratings at one date2

Anti-patterns

What Claude Might DoWhy It's WrongDo This Instead
Rank players by average finish at the courseFinish depends on field size and luckUse vs_field per round
Add course history without a baselineIt double-counts general skillSubtract the overall level first
Use today's rating as the baseline for a 2019 startLeakageas_of before each edition
Trust 2 starts8 rounds is noiseShrink and show n_rounds
Ignore a venue moveDifferent courseSplit the record
Call a player a "course horse" on one winOne week of luckRequire multiple editions

Output Format

Scottie Scheffler at the Masters (Augusta National), 7 starts
Wins 2, top tens 5, average finish 7.9, strokes versus the field +2.78 a round.
Baseline rating before each start: see get_ratings as_of.
Shrunk fit estimate: +X.XX a round (n = 28 rounds, k = <value used>)

What to Do Next

What You FoundNext ActionSkill
A fit number per golferFeed it into a win modeloutright-model
A mechanism questionLook at hole splitshole-scoring
Fit used as a featureCheck for leakagefeature-engineering
Want to validate the weightOut-of-sample testwalk-forward-validation

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.