skills/route-researcher/SKILL.md
Research North American mountain peaks and generate comprehensive route beta reports
npx skillsauth add dreamiurg/claude-mountaineering-skills route-researcherInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Research mountain peaks across North America and generate comprehensive route beta reports combining data from multiple sources including PeakBagger, SummitPost, WTA, AllTrails, weather forecasts, avalanche conditions, and trip reports.
Data Sources: This skill aggregates information from specialized mountaineering websites (PeakBagger, SummitPost, Washington Trails Association, AllTrails, The Mountaineers, and regional avalanche centers). The quality of the generated report depends on the availability of information on these sources. If your target peak lacks coverage on these websites, the report may contain limited details. The skill works best for well-documented peaks in North America.
Use this skill when the user requests:
Examples:
Research Progress:
Goal: Identify and validate the specific peak to research.
Extract Peak Name from user message
Search PeakBagger using peakbagger-cli:
uvx --from "git+https://github.com/dreamiurg/[email protected]" peakbagger peak search "{peak_name}" --format json
Handle Multiple Matches:
If multiple peaks found: Use AskUserQuestion to present options
If single match found: Confirm with user
If no matches found:
Extract Peak ID:
peak_id fieldGoal: Get detailed peak information and coordinates needed for location-based data gathering.
This phase must complete before Phase 3, as coordinates are required for weather, daylight, and avalanche data.
Retrieve detailed peak information using the peak ID from Phase 1:
uvx --from "git+https://github.com/dreamiurg/[email protected]" peakbagger peak show {peak_id} --format json
This returns structured JSON with:
Error Handling:
Once coordinates are obtained from this step, immediately proceed to Phase 3.
Goal: Gather comprehensive route information from all available sources.
Execution Strategy: Run Python script for deterministic API data + dispatch specialized agents in parallel for web research. This hybrid approach minimizes token usage while maximizing parallelism.
Run the conditions fetcher script to gather all API-based data:
cd "{repo_root}/skills/route-researcher/tools"
uv run python fetch_conditions.py \
--coordinates "{latitude},{longitude}" \
--elevation {elevation_m} \
--peak-name "{peak_name}" \
--peak-id {peak_id} \
--trailhead "{trailhead_lat},{trailhead_lon}" \
--distance-mi {round_trip_distance_mi} \
--gain-ft {total_gain_ft} \
--start-time "{HH:MM}" \
--waypoint "{lat1},{lon1}" --waypoint "{lat2},{lon2}"
Optional args: --trailhead enables multi-county path sampling (trailhead→summit); hospital/ranger lookups always run from the summit regardless; --distance-mi/--gain-ft enable time_estimates; --start-time (with distance + gain) enables itinerary; --waypoint (2+) enables bearings.
This returns JSON with:
snow_line_note (human-readable framing of freezing level as snow line) and near_summit (bool: true when freezing level within 2000 ft of summit)astronomical_dawn, nautical_dawn, civil_twilight (dawn), sunrise, sunset, civil_dusk, nautical_dusk, astronomical_dusk; values are null at high latitudes when sun doesn't reach threshold (white nights); daylight_hours, timezoneroped_hr, unroped_hr, fast_hr, moderate_hr, leisurely_hr) — only present when --distance-mi and --gain-ft CLI args are providedstart_time, summit_eta, turnaround_by, return_eta, total_hr, after_dark bool, dusk_cutoff, note) — only present when --start-time, --distance-mi, AND --gain-ft are all provided; after_dark: true is a safety warning that must be prominently surfaced; total_hr is the full round-trip duration in hourssegments[] with bearing_deg, distance_mi, cumulative_distance_mi; total_distance_mi) — only present when 2 or more --waypoint "lat,lon" args are providedcounties[] with county_name, county_fips, state_name, state_code); sampled bool and sample_points int indicate whether path sampling ran (requires --trailhead); without --trailhead only the summit county is returnedhospitals[] with name, lat, lon, distance_miles, emergency, and phone/website/address when OSM has them); sorted emergency-first then by distance; max 3stations[] with name, lat, lon, distance_miles, and phone/website/address when present) + optional admin_district (district_name, forest_name, region) when the summit coordinates intersect a USFS ranger districtcampgrounds[] with name, lat, lon, distance_miles, camp_type, backcountry, operator, and website when present); backcountry/high camps are NOT included — extract those from trip reportsRun this in parallel with Step 3B — include both the Bash command for fetch_conditions.py and all 3 Task calls in the same response turn to maximize parallelism.
Dispatch 3 Researcher agents in a single message (all Task calls together). Each agent researches assigned sources and fetches trip report content directly.
Agent 1: PeakBagger + SummitPost
Task(
subagent_type="general-purpose",
model="sonnet",
prompt="""You are a route researcher gathering mountaineering data for {peak_name}.
## Your Assignment
Research from these sources: PeakBagger, SummitPost
## PeakBagger Research
1. Search: "{peak_name} site:peakbagger.com"
2. Extract route descriptions from peak page
3. List recent ascents with trip reports:
```bash
uvx --from "git+https://github.com/dreamiurg/[email protected]" peakbagger peak ascents {peak_id} --format json --with-tr --limit 20
Identify trip reports with content (word_count > 0)
Fetch content for up to 5 recent trip reports using:
uvx --from "git+https://github.com/dreamiurg/[email protected]" peakbagger ascent show {ascent_id} --format json
Search: "{peak_name} site:summitpost.org"
Use WebFetch to extract: route name, difficulty, approach, description, hazards
If WebFetch fails, use the fetching ladder:
# Fast path (httpx with browser-like headers, no browser)
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py "{url}"
# If the above returns {"error": ...} or content is blocked/JS-rendered:
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py --render "{url}"
For each report fetched, extract:
{
"sources": ["PeakBagger", "SummitPost"],
"route_info": [
{"source": "...", "name": "...", "difficulty": "...", "description": "...", "hazards": [...]}
],
"trip_reports": [
{"source": "...", "date": "...", "author": "...", "url": "...", "summary": "...", "conditions": "...", "has_gpx": false,
"rockfall": "...", "icefall": "...", "cornices": "...",
"downclimbs": "...", "crossings": "...", "water_sources": "...", "camps": "..."}
],
"gaps": ["what couldn't be fetched and why"]
}
```"""
)
Agent 2: WTA + Mountaineers + Regional Sources
Task(
subagent_type="general-purpose",
model="sonnet",
prompt="""You are a route researcher gathering mountaineering data for {peak_name}.
## Your Assignment
Research from these sources: WTA, Mountaineers.org, northwesthikers.net, hikeoftheweek.com, Oregon Hikers Field Guide (oregonhikers.org), Cascade Climbers (cascadeclimbers.com), Mountain Project
## WTA Research
1. Search: "{peak_name} site:wta.org"
2. Find the hike page and extract: trail name, difficulty, distance, elevation gain, hazards
3. Get trip reports from AJAX endpoint: {wta_url}/@@related_tripreport_listing
4. Fetch content for up to 5 recent trip reports using the fetching ladder:
```bash
# Fast path first
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py "{trip_report_url}"
# If output contains {"error": ...} or content is blocked/JS-rendered:
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py --render "{trip_report_url}"
cloudscrape.py "{url}" (fast path usually sufficient)Search: "{peak_name} site:hikeoftheweek.com"
MUST use --render flag — site is Cloudflare-protected and blocks WebFetch:
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py --render "{url}"
Extract: logistics, route narrative, access notes, trailhead directions
cloudscrape.py "{url}"cloudscrape.py "{url}"If WebFetch fails for any page, use the fetching ladder: cloudscrape.py "{url}" (fast) → cloudscrape.py --render "{url}" for JS-rendered or Cloudflare-protected pages.
For each report fetched, extract:
{
"sources": ["WTA", "Mountaineers", "NWHikers", "HikeOfTheWeek", "OregonHikers", "CascadeClimbers", "MountainProject"],
"route_info": [
{"source": "...", "name": "...", "difficulty": "...", "description": "...", "hazards": [...]}
],
"trip_reports": [
{"source": "...", "date": "...", "author": "...", "url": "...", "summary": "...", "conditions": "...", "has_gpx": false,
"rockfall": "...", "icefall": "...", "cornices": "...",
"downclimbs": "...", "crossings": "...", "water_sources": "...", "camps": "..."}
],
"gaps": ["what couldn't be fetched and why"]
}
```"""
)
Agent 3: AllTrails
Task(
subagent_type="general-purpose",
model="sonnet",
prompt="""You are a route researcher gathering mountaineering data for {peak_name}.
## Your Assignment
Research from AllTrails
## AllTrails Research
1. Search: "{peak_name} site:alltrails.com"
2. Use WebFetch to extract: trail name, difficulty, distance, elevation gain, route type, best season, hazards
3. If WebFetch fails, use:
```bash
uv run python {repo_root}/skills/route-researcher/tools/cloudscrape.py "{url}"
{
"sources": ["AllTrails"],
"route_info": [
{"source": "...", "name": "...", "difficulty": "...", "distance_miles": N, "elevation_gain_ft": N, "description": "...", "hazards": [...],
"rockfall": "...", "icefall": "...", "cornices": "...",
"downclimbs": "...", "crossings": "...", "water_sources": "...", "camps": "..."}
],
"trip_reports": [],
"gaps": ["what couldn't be fetched and why"]
}
```"""
)
Execute all 3 agents in parallel by including all Task calls in a single response.
After Python script and all agents return, aggregate into unified data structure:
{
"conditions": { /* from fetch_conditions.py */ },
"route_data": {
"sources": [ /* merged from all 3 agents */ ],
"trip_reports": [ /* merged from all agents */ ]
},
"gaps": [ /* merged gaps from all sources */ ]
}
Partial Failure Handling:
Determine permits AND the current road/gate status to the trailhead — do not just tell the user to go check. Actively research and report the actual status with a source and date.
Permits:
WebSearch: "{peak_name} trailhead access" ; "{peak_name} permit requirements"
Road / gate status workflow (identify the access highway + forest road + managing agency first, then check sources in order; capture each source URL for the report):
https://wsdot.com/travel/real-time/mountainpasses/mt.-baker (SR-542) or .../north-cascades (SR-20). Read RoadCondition / TravelAdvisoryActive / restrictions. Other states: WebSearch "{state} DOT mountain pass report {highway}".https://www.fs.usda.gov/{region}/{forest-shortname}/alerts (e.g. r06/mbs/alerts) and /conditions; search the page for the road number / trailhead name → closure milepost, reason, seasonal gate. Also WebSearch "{forest name} {road or trailhead} road open {year}" for seasonal-opening press releases.https://www.nps.gov/{park-code}/planyourvisit/road-conditions.htm (e.g. noca, mora, olym) → per-road OPEN/CLOSED + milepost.WebSearch "site:wta.org {trail} gate road open closed {year}" or fetch the hike page; scan the 3-5 most recent trip reports for "gate"/"road open/closed"/"drove to" (use cloudscrape.py --render if WTA 403s).WebSearch "inciweb {area} closure {trailhead} {year}"; if an active incident is near the trailhead, read its closure page.Synthesize into a dated status statement for the report's Road Conditions section:
"Gate/road status (as of {date}): {road} is {OPEN/CLOSED/SEASONAL GATE/UNKNOWN} per source. {If closed: gate at {milepost}, adds ~{N} mi each way.}"
If no source confirms it, say so explicitly and include the managing ranger station phone as the fallback. Add trailhead names, permits, the status statement, and all source URLs to route_data.
Goal: Analyze gathered data to determine route characteristics and synthesize information.
Based on route descriptions, elevation, and gear mentions, classify as:
Goal: Combine trip reports and route descriptions from Step 3B researcher agents, plus conditions data from Step 3A, into comprehensive route beta.
Source Priority:
Synthesis Pattern for Route, Crux, and Hazards:
url (and date/author) through synthesis so it can be linked; use the date/author as the link text. For consensus phrasing ("multiple reports mention…"), link 2-3 of the contributing reports inline. Only general/published beta with no specific source stays unlinked.Example (Route Description):
"The standard route follows the East Ridge (Class 3). A Sep 2025 party found a well-cairned use trail branching right at 4,800 ft—the correct turn—through talus they called 'tedious' and 'ankle-rolling'. An Oct 2025 report noted the section was snow-covered, requiring microspikes."
Apply this pattern to:
Extract Key Information:
From all synthesized data, identify:
conditions.time_estimates (keys: fast_hr, moderate_hr, leisurely_hr, roped_hr, unroped_hr) from fetch_conditions.py output — present only when it was called with --distance-mi and --gain-ft. If time_estimates is absent from the conditions data, note it in Information Gaps. To populate it: re-invoke fetch_conditions.py with --distance-mi {distance} and --gain-ft {gain} once route distance/gain are known from Step 3B research. At the same time, add --start-time HH:MM to get itinerary and --waypoint args to get bearings — these optional outputs only activate when the args are supplied.Include these geodata fields when available. Every place named in the report must be a link — see the link patterns below.
Place / map link patterns (build from a place's lat/lon and name):
https://www.google.com/maps/search/?api=1&query={URL-encoded name + address} — use this (not bare coordinates) for hospitals, ranger stations, campgrounds, and any named place, so the link resolves to the actual entity. When only coordinates are meaningful, query={lat},{lon}.https://www.gaiagps.com/map/?loc=14/{lon}/{lat} (zoom/lon/lat).https://caltopo.com/map.html#ll={lat},{lon}&z=14&b=mbt.Surfacing rules:
county_name + state_name from conditions.counties.counties[] in the Overview. Empty/error → Information Gaps.conditions.nearest_hospital.hospitals[] and conditions.ranger_station (stations + admin_district). Link each name to its website if present, else a Google Maps place search by name + address. Always include phone AND address columns — each entry now carries phone/website/address/lat/lon when OSM has them; if phone or address is missing, make a best effort to find the entity's real phone/address (its official site or Google Maps listing) before writing "—". Missing/error → note in Information Gaps.conditions.campgrounds.campgrounds[]; link the name (website or Google Maps place) and add Google Maps + Gaia map links from each entry's lat/lon.Explicitly document what data was not found or unreliable:
Goal: Create comprehensive Markdown document by dispatching Report Writer agent.
Organize all gathered and analyzed data into structured JSON:
{
"peak": {
"name": "{peak_name}",
"id": {peak_id},
"elevation_ft": {elevation},
"coordinates": [{latitude}, {longitude}],
"location": "{location}",
"peakbagger_url": "{url}"
},
"conditions": {
// From fetch_conditions.py output
"weather": {"forecast": [{"date": "...", "snow_line_note": "...", "near_summit": bool, "freezing_level_ft": N, ...}], ...},
"air_quality": {...},
"daylight": {"astronomical_dawn": "...", "nautical_dawn": "...", "civil_twilight": "...", "sunrise": "...", "sunset": "...", "civil_dusk": "...", "nautical_dusk": "...", "astronomical_dusk": "...", "daylight_hours": N},
"avalanche": {...},
"peakbagger": {...},
"counties": {"counties": [{"county_name": "...", "county_fips": "...", "state_name": "...", "state_code": "..."}], "sampled": bool, "sample_points": N}, // sampled + sample_points only present when --trailhead was given
"nearest_hospital": {"hospitals": [{"name": "...", "lat": N, "lon": N, "distance_miles": N, "emergency": "yes|null", "phone": "...", "website": "...", "address": "..." /* phone/website/address optional */}]},
"ranger_station": {"stations": [{"name": "...", "lat": N, "lon": N, "distance_miles": N, "phone": "...", "website": "...", "address": "..." /* optional */}], "admin_district": {"district_name": "...", "forest_name": "...", "region": "..."}},
"campgrounds": {"campgrounds": [{"name": "...", "lat": N, "lon": N, "distance_miles": N, "camp_type": "...", "operator": "...", "website": "..." /* optional */}], "note": "..."},
"time_estimates": {"roped_hr": N, "unroped_hr": N, "fast_hr": N, "moderate_hr": N, "leisurely_hr": N, "note": "..."},
"itinerary": {"start_time": "HH:MM", "summit_eta": "HH:MM", "turnaround_by": "HH:MM", "return_eta": "HH:MM", "total_hr": N, "after_dark": false, "dusk_cutoff": "9:15 PM" /* 12-hr AM/PM format, unlike other time fields */, "note": "..."},
"bearings": {"segments": [{"from": 0, "to": 1, "bearing_deg": N, "distance_mi": N, "cumulative_distance_mi": N}], "total_distance_mi": N}
},
"route_data": {
// Merged from all Researcher agents
"sources": [...],
"trip_reports": [...]
},
"analysis": {
// From Phase 4
"route_type": "{hike|scramble|technical|glacier}",
"difficulty": "{rating}",
"crux": "{description}",
"hazards": [...],
"access": {...}
},
"gaps": [...]
}
Task(
subagent_type="general-purpose",
model="sonnet",
prompt="""You are a Report Writer generating a mountaineering route report.
## Instructions
1. **Read the report template:**
Use the Read tool to read: {repo_root}/skills/route-researcher/assets/report-template.md
2. **Generate report following template structure exactly:**
- Header with peak name, elevation, location, date
- AI disclaimer (prominent safety warning)
- Overview: route type, difficulty, distance/gain, time estimates
- Route Description: synthesized from sources, include landmarks
- Crux: describe hardest section with specifics
- Known Hazards: comprehensive list
- Current Conditions: weather forecast, freezing levels, air quality, daylight
- Trip Reports: links organized by source with dates
- Information Gaps: explicitly list missing data
- Data Sources: links to all sources used
3. **Markdown Formatting Rules:**
- ALWAYS add blank line before lists
- ALWAYS add blank line after section headers
- Use `-` for bullets (not `*` or `+`)
- Use `**text**` for bold emphasis
- Break paragraphs >4 sentences
- **Link specific-report attributions.** Any statement attributed to a particular trip/climb report (a date, a quote, "one party…", "a recent report…") MUST be a Markdown link `[date/author](report_url)` to that report's source URL — never plain-text attribution. Pull the URL from the matching `trip_reports[].url` in the data package. Leave only generic/published beta (no specific source) unlinked.
4. **Save the report:**
Use the Write tool to save to the user's current working directory: {date}-{peak-name-slug}.md
## Data Package
{data_package_json}
## Output Format (return EXACTLY this JSON)
```json
{
"status": "SUCCESS",
"file_path": "/absolute/path/to/report.md",
"filename": "YYYY-MM-DD-peak-name.md",
"sections_generated": N
}
```"""
)
Extract file_path from agent's JSON response for use in Phase 6.
Goal: Validate report quality by dispatching Report Reviewer agent.
Task(
subagent_type="general-purpose",
model="opus",
prompt="""You are a Report Reviewer validating a mountaineering route report.
## Instructions
1. **Read the report:**
Use the Read tool to read: {report_file_path}
2. **Perform systematic quality checks:**
**Factual Consistency:**
- Dates match their stated day-of-week (e.g., "Thu Nov 6, 2025" is actually Thursday)
- Coordinates, elevations, distances consistent across all mentions
- Weather forecasts align logically (freezing levels match precipitation types)
**Mathematical Accuracy:**
- Elevation gains add up correctly
- Time estimates reasonable given distance and elevation gain
- Unit conversions correct (feet to meters, etc.)
**Internal Logic:**
- Hazard warnings align with route descriptions
- Recommendations match current conditions
- Crux descriptions match overall difficulty rating
**Completeness:**
- No placeholder texts like {{peak_name}} or {{YYYY-MM-DD}}
- All referenced links actually provided
- Mandatory sections present: Overview, Route, Current Conditions, Trip Reports, Information Gaps, Data Sources
**Formatting:**
- Markdown headers properly structured
- Lists have blank lines before them
- Tables properly formatted
**Safety & Responsibility:**
- AI disclaimer present and prominent
- Critical hazards properly emphasized
- Users directed to verify information from primary sources
**Emergency contacts & location links (verify INDEPENDENTLY):**
- Each emergency contact (hospital, ranger station) has a working name link (website or a Google Maps place link to the actual entity — NOT bare coordinates), a phone, and an address. Independently confirm the phone/address look right for that named entity (e.g. via its official site / Google Maps); fix or flag mismatches and fill blanks you can confirm.
- Road/gate status is a dated statement with a cited source, not a "go check it yourself" punt.
- Every named place in the report (campsite, bivy, high camp, trailhead, named feature) carries map links (Google Maps + Gaia GPS). Flag any named location missing links.
- Specific trip-report attributions are hyperlinks to their source, not plain text.
3. **Fix issues:**
- **Critical** (safety errors, factual errors, missing disclaimers): MUST fix using Edit tool
- **Important** (completeness, consistency): SHOULD fix
- **Minor** (formatting, polish): FIX if quick
## Output Format (return EXACTLY this JSON)
```json
{
"status": "PASS" | "PASS_WITH_FIXES" | "FAIL",
"issues_found": N,
"fixes_applied": ["description of fix 1", "description of fix 2"],
"remaining_issues": ["issues that couldn't be fixed"],
"report_path": "/absolute/path/to/report.md"
}
```"""
)
Handle the reviewer agent's response:
report_pathremaining_issues to user and ask for guidanceThe Report Reviewer automatically fixes issues and returns the corrected file path.
Goal: Inform user of completion and next steps.
Report to user:
fetch_conditions.py with --start-time HH:MM (adds itinerary key) and/or --waypoint lat,lon flags (2+ waypoints add bearings key). Surface after_dark: true as a prominent safety warning.skills/route-researcher/assets/trip-report-template.md as a starting point for filing a trip report.Example completion message:
Route research complete for Mount Baker!
Report saved to: 2025-10-20-mount-baker.md
Summary: Mount Baker via Coleman-Deming route is a moderate glacier climb (Class 3) with significant crevasse hazards. The route involves 5,000+ ft elevation gain and typically requires an alpine start. Weather and avalanche forecasts are included.
Next steps: Review the report and verify current conditions before your climb. Remember that mountain conditions change rapidly - check recent trip reports and weather forecasts immediately before your trip.
Throughout execution, follow these error handling guidelines:
cloudscrape.py "{url}" (fast httpx, no browser) → cloudscrape.py --render "{url}" (Patchright stealth browser, for JS-rendered or Cloudflare-protected pages)--render: hikeoftheweek.com and any site where the default path returns {"error": ...} on stdout or where content is blocked/JS-renderedEvery generated report must:
See skills/route-researcher/docs/architecture.md for detailed execution flow, component overview, data contracts, and design decisions.
All commands use --format json for structured output. Run via:
uvx --from "git+https://github.com/dreamiurg/[email protected]" peakbagger <command> --format json
Available Commands:
peak search <query> - Search for peaks by namepeak show <peak_id> - Get detailed peak information (coordinates, elevation, routes)peak stats <peak_id> - Get ascent statistics and temporal patterns
--within <period> - Filter by period (e.g., '1y', '5y')--after <YYYY-MM-DD> / --before <YYYY-MM-DD> - Date filterspeak ascents <peak_id> - List individual ascents with trip report links
--within <period> - Filter by period (e.g., '1y', '5y')--with-gpx - Only ascents with GPS tracks--with-tr - Only ascents with trip reports--limit <n> - Max ascents to return (default: 100)ascent show <ascent_id> - Get detailed ascent informationNote: For comprehensive command options, run peakbagger --help or peakbagger <command> --help
Common variations to try if initial search fails:
Build these centered on the summit (decimal degrees) for the report Overview line.
Google Maps:
https://www.google.com/maps/search/?api=1&query={latitude},{longitude}
CalTopo (MapBuilder Topo base, zoom 14):
https://caltopo.com/map.html#ll={latitude},{longitude}&z=14&b=mbt
Gaia GPS (order is zoom/longitude/latitude):
https://www.gaiagps.com/map/?loc=14/{longitude}/{latitude}
PeakVisor hiking map (zoom/latitude/longitude; slashes URL-encoded as %2F in the query):
https://peakvisor.com/hiking-map?custom=14%2F{latitude}%2F{longitude}#14/{latitude}/{longitude}
Example (Mt Baker, 48.7768, -121.8144):
https://www.google.com/maps/search/?api=1&query=48.7768,-121.8144https://caltopo.com/map.html#ll=48.7768,-121.8144&z=14&b=mbthttps://www.gaiagps.com/map/?loc=14/-121.8144/48.7768https://peakvisor.com/hiking-map?custom=14%2F48.7768%2F-121.8144#14/48.7768/-121.8144Note: Use decimal degrees. Gaia GPS expects zoom/longitude/latitude order; CalTopo and PeakVisor use latitude then longitude.
If coordinates available (e.g., from Mountaineers.org place information):
https://www.google.com/maps/search/?api=1&query={latitude},{longitude}
Example: https://www.google.com/maps/search/?api=1&query=48.5123,-121.0456
If only trailhead name available:
https://www.google.com/maps/search/?api=1&query={trailhead_name}+{state}
Example: https://www.google.com/maps/search/?api=1&query=Cascade+Pass+Trailhead+WA
Note: Prefer coordinates when available for more precise location.
Skill Version: 5.1.0 | Last Updated: 2026-05-22
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
OpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.
data-ai
OpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.