Workflow: Multi-day-trip report¶
Trigger: "plan a backpack trip with peaks over several days" — a trip with a pack-in, peaks bagged from a basecamp (or moving camps) across multiple days, and a pack-out.
Output: docs/trips/<slug>.md + CalTopo map + docs/maps/<slug>.png.
This is the most complex flavor: it's a day-trip report per day, wrapped in trip-level logistics (camps, water, gear, pack weight, weather windows).
Checklist¶
Source rigor (all three sources, confirmed logged-in) on every peak in the itinerary, plus:
- [ ] Itinerary design — group peaks by day from the basecamp(s); balance daily gain/distance/class
- [ ] Pack/move days are REAL days (Kyle, 2026-07-12) — the At-a-glance day list
numbers EVERY calendar day: pack-in, climbing days, camp moves, pack-out. Entries in
approach:/packout:/days_detailtake an optionalday: Nso two legs can share a day (e.g. a morning summit + afternoon camp move); without it each entry auto-increments. The header's "N-day trip" derives from the sequence (frontmatterdays:keeps its gate meaning: climbing days with routes). When building the report, decide — and RECOMMEND — where camp moves and pack legs fall: stack a move with a moderate climbing day when both halves are easy and it saves a night; give it its own day when the adjacent climbs are the trip's crux (keep Class 4+ on fresh legs). - [ ] Basecamp selection — its own report section (Kyle, 2026-07-10) — a "Basecamp — options & considerations" section listing every viable camp (elevation, pros/cons table) plus water/marmots/exposure/LNT notes. The recommended camp is what the pack-in stats and day stats assume; the options are there for parties who choose differently.
- [ ] Pack-in / pack-out in "At a glance" (Kyle, 2026-07-10 — ALWAYS for backpacks) —
frontmatter
approach: {label, dist_mi, gain_ft, loss_ft}andpackout: {…}; gen_quickstats renders them as their own lines around the per-day list, plus a trip total (mi · ft) in the summary line, auto-summed from pack-in + days + pack-out so it can't drift from the components. Stats measured to the RECOMMENDED camp; body text covers the alternatives. - [ ] One recommended route per LEG (Kyle, 2026-07-10 — the map must show the whole
trip) — a magenta line for the pack-in, each climbing day from camp (not
TH-composed — that redraws the approach and misplaces the day), every camp move, and
the pack-out. Exception: when pack-in and pack-out share a corridor (Vestal/Molas),
ONE corridor line suffices. Recipes live in peaks.yml:
days:entries take an optionaltrack:(verbatim recorded from-camp track) and alegs:block defines non-climbing legs ({label, track}verbatim, or{label, target: <camp-wpt gpx>, start: "lat,lon"}composed point-to-point when no recording covers the full leg). All built bybuild_trip_day_routes.py; every leg's stats come from its measured line + DEM. Sanity-check leg ENDPOINTS connect (GPS recordings often start late — compose those). Keep frontmatterdist_mi/gain_ftequal to the component sum (they feed the index table). - [ ] Water sources along approach and near camp (mark on map)
- [ ] Per-day peak stats from GPX (each day's loop from camp). Peaks at different trailheads → don't auto-route one loop; run
build_recommended_route.pyper day-area and setdays_detail+ a per-day-sumdist_mi/gain_ft. (Build the recommended route right) - [ ] Weather — peaks ≤6 mi apart: one
weather:NOAA link for the central peak. Peaks >6 mi apart: awx:NOAA link perdays_detailday (forecast.weather.gov/MapClick.php?lat=&lon= for the day's central peak). - [ ] Gear notes — group + personal + technical (rope/axe/crampons if any day needs it)
- [ ] Weather-window strategy — which day for the hardest/most-exposed peaks
- [ ] Bailout/escape routes from camp
- [ ] Single CalTopo map + PNG showing camps, water, pack route, and each day's loop
Body sections (multi-day flavor — v2 format, Kyle 2026-07-12)¶
Fixed order, --- between sections; exemplar: Jupiter, Pigeon & Turret.
At-a-glance is the ONLY home for day stats (headings carry class only); provenance
detail lives only in the map-box note + Trip reports section.
- Danger box (if Class 4/5 / genuinely sketchy — ≤1 line per hazard)
- Peaks covered — intro sentence (style · hardest move · access · days/nights;
absorbs the old trip-at-a-glance table) + table with names linked to
14ers.com/peaks/<id> - Itinerary options — when more than one option exists, EVERY option gets a day-table with the same columns (Kyle, 2026-07-12 — not prose for A and a table for B); the recommendation + stacking rationale follow as prose. Settled decisions get one inline line pointing at Other considerations
- Getting there — train/access/trailhead + the clickable drive-from-home link
- The days, in order —
### Day N — …strictly chronological (pack-in = Day 1, pack-out = last; a shared day gets "Day N, morning/afternoon") - Camps & water — camp options table + water + regs merged
- Gear & season — gear + season window + monsoon strategy + bail-outs merged
- Other considerations (optional) — judgment forks with full rationale (direction, alternate access…)
- Trip reports & GPX — grouped by source; sweep counts live here
- Sources checked footer
Notes¶
- Reference implementation: South San Juans 3-Day (Bennett + Conejos + Summit/Montezuma/Unicorn trio). It's a car-camp / move-camp-by-vehicle trip, not a backpack — so the "pack-in/basecamp" sections become vehicle relocations + dispersed car camps near each day's trailhead. Adapt the template to the trip's style (backpack vs. car-camp).
- Driving route on the PNG + directions links (Kyle, 2026-06-07/08). For multi-day trips, show the road connecting the camps/trailheads on the overview PNG and give clickable directions between approaches.
build_drive_route.py --slug <slug>routes the actual road (OSRM) through thekind: trailheadlandmarks inpeaks.ymlorder and writes<slug>_drive.gpx;make_overview_maprenders any*_drive*file as a reserved black dashed line (a color not used on the CalTopo map, so it reads as "road", not a GPS track), andgpx_to_caltoposkips it (PNG-only, never uploaded). The same script also prints clickable Google-Maps directions links per leg — drop them into a "Driving directions between approaches" subsection under Logistics (standard for every trip report).build_report.pyrunsbuild_drive_routeautomatically when a trip has ≥2 trailheads. - Only summiting tracks on the map (Kyle, 2026-06-08). A track belongs on a report's map (PNG and CalTopo) only if it actually summits a researched/objective peak — passing nearby is not route beta. Enforced in two places:
caltopo_mytracks.pydrops bbox tracks that don't top out within ~240 m of anobjective_idssummit, andmake_overview_map.pyapplies the same summit filter at render time (objectives frompeaks.ymlvia peak_db). This also supersedes the old centroid/near-cluster clip. - Camps/water/pack-route are first-class map features here (unlike day-trips). The objective box for the PNG should span the basecamp + the peaks, not just the summits. For trips whose zones are far apart (e.g. ~17 mi), the single PNG is a regional locator (peaks small, drive route shown) — per-area route detail lives on the interactive CalTopo map.