Surf Region Ranking Skill
Use this skill when the user asks for the best surf spots in a region based on wave height, wind direction, and wind speed.
Goal
For a user-specified region:
- Run the Go collector script to gather surf, wind, and tide data per spot.
- Score every spot in the region inside the agent (not in Go).
- Return the top 3 spots by total score with explanations.
Category scores are:
- Wave height
/10 - Wind direction
/10 - Wind speed
/10
Total score is /30.
Important architecture rule
The Go script is data collection only.
It must not be treated as a scorer or ranker.
- Script responsibility: fetch and output spot data
- Agent responsibility: score spots and choose top 3
Required script command
Preferred (preset regions):
go run surfline_region_report.go -region <region> -hours <hours> -output json
Custom spot IDs:
go run surfline_region_report.go -spots "<spotId1,spotId2,...>" -hours <hours> -output json
Default hours to 24 unless the user asks otherwise.
Regions supported by preset
north-orange-countysouth-orange-countysan-diegosanta-cruz
If the user gives an unsupported region, ask for Surfline spot IDs for that region.
Parse JSON output from Go script
Read spots[] from script output. Each spot includes:
spotIdavgSurfMinFtavgSurfMaxFtavgPrimarySwellFtavgWindMphavgWindDirectionDegavgTideFtvalidHours
Use avgSurfMaxFt as the main wave-height comparison value.
Scoring rubric (agent-side, 0-10 each)
Compute scores for all valid spots in the selected region.
1) Wave height score (0-10, relative within region)
Let waveMax = avgSurfMaxFt.
waveScore = 10 * (waveMax - minWaveMax) / (maxWaveMax - minWaveMax)- If all spots have identical
waveMax, assignwaveScore = 5for all - Clamp to
[0, 10]
Interpretation: bigger rideable waves in the same region score higher.
2) Wind speed score (0-10, lower is better)
Let windSpeed = avgWindMph.
<= 4 mph:10> 4 and <= 8:8> 8 and <= 12:6> 12 and <= 16:4> 16 and <= 20:2> 20:0
3) Wind direction score (0-10)
Default directional rubric unless user provides local break orientation:
315-360or0-45: offshore/cross-offshore ->946-90or271-314: side-shore ->691-270: onshore/cross-onshore ->2
If user provides local direction guidance for a break, that guidance overrides defaults.
Total score
totalScore = waveScore + windSpeedScore + windDirectionScore- Max total =
30 - Round all category and total scores to 1 decimal place
Required response format
Return only the top 3 spots sorted by totalScore descending.
For each ranked spot include:
- Spot ID (or spot name if available)
- Wave score
/10andavgSurfMaxFt - Wind direction score
/10andavgWindDirectionDegplus label - Wind speed score
/10andavgWindMph - Total score
/30 - 1-3 sentence explanation of why the spot earned the rank
After the list, include one short sentence naming the #1 recommendation.
Behavior rules
- Always score all valid spots before picking top 3.
- If fewer than 3 valid spots exist, return all and explain why.
- If script fetch fails for a spot, exclude it and mention exclusion.
- Do not invent missing values; only use data returned by the script.