Gate compliance status¶
What this page is
The gates are the source of truth for which reports are inconsistent — not notes kept elsewhere. Every report is re-measured whenever a gate or format-defining file changes, and anything that no longer conforms is listed here instead of blocking the build.
A row below is drift, not damage: these reports were built by older scripts and predate a check that came later. The fix is normally just to rebuild that report with the current scripts.
Generated: 2026-09-10T13:20:06Z · 88 reports checked · 63 out of compliance · 25 clean
Tooling health¶
This is about the MACHINE, not the reports
The gate tables below answer "is each report consistent?". This section answers "is the pipeline that builds them correct?" — a defect in a shared script affects every report equally and stays invisible to a per-report gate until some input happens to expose it.
The remedy for a row here is a code fix with a failing test first — never "rebuild that report", which is the remedy for every gate row below.
0 open defect(s) · 0 of those with nothing currently failing (asserted, not established) · 11 open enhancement(s) (enhancements are not defects and never block a report) · 16 of 16 defect(s) resolved — see Previous defects at the foot of this page
No open defects — new reports are not blocked
Only enhancements are open. A missing capability is not a broken one, so
preflight.py does not refuse a new report on their account.
Environment + rails (working tree, allow-list, instructions)¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ open | orchestrator-builds-the-decision-artifact — Every stop that needs Kyle should PRODUCE its own decision artifact — the maps rendered, embedded and published as a page with a URL — instead of leaving Claude to assemble one by hand each time. The orchestrator already knows everything the page needs: the phase, the blockers, the old and new routes, the objective peaks, the CalTopo id. | scripts/build_report.py, scripts/inline_png.py, scripts/grouping_map.py |
Kyle, 2026-08-13: "its obvious that it needs to do the map part also. another thing I can't trust you to do... something in the orchestrator makes the artifact for me to consume." Measured on this batch: fairview's page took several manual steps and two corrections (side-by-side too small, PNG cropped); brown_mountain halted and sat idle while Claude hand-built maps, which Kyle experienced twice as "looks stuck". A hold or a route-quality block is exactly when Kyle is waiting, so hand-assembly is the worst possible time cost — and an artifact Claude forgets to build is a decision Kyle cannot make at all. The layout rules are already fixed (one overlay by default; stacked panels only when one route is a near-subset; frame must contain both routes end to end; inline_png.py embeds because the artifact CSP blocks external images), so the remaining work is wiring them into the stop path rather than inventing them. |
| ✦ open | parked-reports-answer-queue-and-warm-resume — Parks become a QUESTION QUEUE Kyle answers in one sitting, and re-kicked runs restart WARM instead of from scratch. Today --batch-park ABORTS the run — quarantine restored, the agent's partial research rolled back — so a parked report costs a full rebuild and each park interrupts Kyle separately. | scripts/build_report.py |
Kyle, 2026-08-12: "if it needs my input I can answer a series of questions for the parked reports in a batch all at once then they get kicked off again." The pieces mostly exist: PARKED.md already carries each park's questions, and deviations.yml reviewed_call entries already carry Kyle's answers into resumed runs (proven twice on homestake/pt_13060_b). Missing: (1) --batch-questions collects every parked slug's questions into one sitting; (2) answers recorded as reviewed_calls; (3) WARM RESTART — the park preserves the run's research artifacts (partial peaks.yml, PARKED.md, agent reasoning) to a parked-archive and the re-kicked run feeds them to the fresh agent, so nothing re-asks Kyle and the re-run skips re-discovery (sweep is delta, beta cached). TRUE SUSPEND-AND-RESUME (keep the run state; resume from the parked phase) is deliberately deferred to the rebuild-branch design: each suspended run holds its slug's tree torn open, and N parked slugs wedge the repo-wide gates for as long as Kyle takes to answer — suspended runs need to sleep on branches. |
2. sweep — 14ers / LoJ / peakbagger GPX¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ fixed | presweeper-harvests-beta — The presweeper caches GPX but not BETA pages (climb13ers etc.), and the research agent hard-parks on an empty beta cache by standing rule ("NO BETA CACHED ⇒ PARK; never fall back to peak_db yds_class"). Harvest beta for every queued slug in the same presweep browser session so research never parks for want of a page fetch. | .claude/agents/presweeper.md, scripts/ingest_beta.py |
2026-08-12: pt_13060_b's research agent parked solely on the empty beta cache (its other blocker was a genuine Kyle call) — in an otherwise fully-autonomous batch, a mechanical page fetch became a human stop. ingest_beta.py already accepts browser blobs; the presweeper already has the browser open on every site; the marginal cost per slug is one page load. |
| ✦ open | gps-tracks-as-a-source — Make the iCloud Documents/GPS Tracks/ directory a SWEPT SOURCE for building reports, not only an export target. Today build_route writes phone-loadable routes INTO it and nothing ever reads back out. | scripts/export_to_gps_tracks.py (export-only today) |
It holds Kyle's real recordings — the highest-quality beta available for any peak he has already climbed, and the only source that reflects what HE actually walked rather than what some other party did. Motivating case: the jacque_peak review needed his 2026-06-06 Summit County recording and it had to be copied in by hand, because jacque_peak is status:climbed with no _kyle_existing/ at all. Reading Documents/GPS Tracks/ directly also means ONE mechanism instead of two — it makes the peak_checklist drop into _kyle_existing/ redundant rather than something to keep repairing. |
6. build_route — recommended route composition¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ open | kyles-authored-routes-survive-rebuild — Carry a route KYLE AUTHORED forward through a rebuild automatically, instead of letting the composer replace it. Today it survives only if he notices at the publish hold and rejects — so an unattended pass publishes over his work by default. | scripts/build_report.py, scripts/deviation_kinds.py |
brown_mountain (2026-08-13): the live route used the north 4WD roads to start higher and closer, a line Kyle helped build. The rebuild composed an unrelated 11.5 mi multi-peak traverse and would have published it; only his rejection saved it. Kyle: "I guess we lost that context. In the future I would like that kind of thing to survive." Filed as an enhancement, not a defect, because the missing piece is a CAPABILITY (record whose decision a route is, and replay it) rather than broken behaviour — and because deciding WHICH existing routes are his needs him: a census of frozen/no-recipe routes, then a deviations.yml entry per report. He asked not to act on it yet ("don't worry about doing anything about it now"), so it stays visible instead of blocking. |
| ✦ open | composer-avoids-out-of-the-way-summits — Teach the composer to avoid crossing non-objective ranked summits that are NOT on the shortest/least-gain line — the same way osm_access disqualifies restricted land. | scripts/compose_best_route.py |
Kyle's standing rule (2026-08-13): crossing an out-of-the-way non-objective summit "is never okay unless the other summits can not be avoided via the shortest path with the least elevation gain". The orchestrator now parks such a route instead of asking him, which stops the wrong question but still costs a report: brown_mountain's composed line crossed four (Hanson, Tuttle, PT 13,078, Houghton) because it came from a peakbagger's multi-peak day. The composer scoring distance/gain/on-trail has no term for "this line collects summits the report is not about". |
| ✦ open | composer-season-blind — The composer scores distance, gain and on-trail fraction with no concept of SEASON, so it will hand back a winter/ski line as the "best" leg. Penalise winter tracks (and flag undated ones) the way osm_access already disqualifies restricted land. | scripts/compose_best_route.py |
Same blind spot as difficulty, and the same fix pattern. On snowdon_group the proposal came back 7.66 mi built from trk_pb_2 (UNDATED), trk_loj_14449 (SHOULDER 2023-06) and trk_loj_9270 (WINTER 2020-12) — not one summer track in it, and leg 3 a December line where summer beta covering both peaks exists (trk_14ers_1, 11.7 mi, 2024-08). CLAUDE.md's seasonality rule says prefer Jul-Sep, treat Jun/Oct as acceptable-with-note and avoid winter; the composer never reads it, so every proposal has to be re-checked against track_seasons by hand — and now that "always consider composing" is a blocking gate, that hand-check is on every multi-peak report. Kyle, 2026-07-30: "certainly penalize is right but if its all the beta we have we need to build the report with something I guess... certainly should be noted in the report." So the rule is PENALISE, not exclude: a winter line may still win when it is the only beta, and when it does the report must say so. |
make_overview_map / CalTopo — maps + markers¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ open | sweep-new-actual-tracks-onto-maps — On each sweep, look for NEW *_actual tracks in Documents/GPS Tracks/ and add them to the research maps of the peaks they cover, for peaks Kyle has already climbed. | scripts/sync_kyle_recordings.py |
sync_kyle_recordings.py already puts known recordings on a slug's CalTopo map and PNG, but nothing discovers newly-recorded outings. Kyle keeps climbing; his maps should pick up what he did without anyone remembering to wire each one in. |
7. report prose + frontmatter¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ open | prose-inherits-research-context — The prose agent should INHERIT the research context instead of re-discovering it: resume the research agent's session for prose (the documented design — "the SAME agent is resumed for prose"), and embed the research artifacts' contents directly in the prose prompt as the fallback when no resumable session exists. | scripts/run_agent.py, scripts/build_report.py (agent_task) |
Measured 2026-08-12: homestake's prose ran in the RESUMED research agent and took 4m17s; chipeta's prose ran as a fresh spawn that had to re-read peaks.yml, the track listing and the evidence files first — 35+ min for comparable output. Kyle: "worth figuring out how we can optimize to cut down on the work it has to do in prose... or narrow the goal." run_agent spawns claude -p fresh each time; capturing the research run's session id in the run state and resuming it for prose deletes the re-read entirely. Embedding artifacts in agent_task's prose prompt helps every case including non-resumable ones. (Third lever — auditing the report template's 11 NARRATIVE-TODO markers for sections that could be generated rather than authored — is a report-format change and Kyle's call, tracked here as a question, not a plan.) |
| ✦ open | attribute-kyles-track-in-other-climbers-reports — When building a report for another climber (Emily, Shawn) covering a peak Kyle has an _actual track for, highlight that line as KYLE'S recording — named and attributed, not anonymous beta. | scripts/climber.py / gen_index.py (climber reports) |
Kyle's own track is the most trustworthy line on the map for that peak and it comes with a person who can be asked about it. An unattributed track loses that entirely. Blue #0066FF is already the reserved colour for Kyle's recordings, so the convention exists — the attribution in the prose does not. |
8. finalize — gates + compliance¶
| Status | Enhancement | Script | Why it's worth doing |
|---|---|---|---|
| ✦ open | fidelity-bar-may-be-mis-calibrated — RECOMMENDATION FOR KYLE, NOT A CHANGE. The fidelity bar is 3 ft, which is tighter than GPS precision, so a composed route trips it wherever it steps between two recordings — and those steps are physically noise, not corner-cutting. Suspected calibration problem rather than 80 reports each needing paperwork. | scripts/check_route_fidelity.py |
MEASURED over the 2026-08-13 batch: 4 of the reports that reached finalize failed only this gate — bonita_proposal 4 ft, bridal_pk_pt_13145 10 ft, baldy_lejos_trio 13 ft, bonita (earlier run) 43 ft. On bonita the strays are multiple and sequential: accepting the worst one simply revealed the next at another junction, so per-point acceptance is whack-a-mole and the per-report envelope (fidelity_max_ft) becomes the de-facto answer on every composed route. Kyle, 2026-08-13, on why this must be HIS call and not a quiet per-report fix: "if you just fix it with a small note to me and I miss it you're likely to override it later because of something else and this stays flakey" — a ruling he makes becomes one rule with a test applied to all 88 reports; a patch Claude makes is invisible drift. OPTIONS TO RULE ON (each is a one-line change plus a fleet re-measure): (a) raise the fleet bar to ~6-8 ft — still an order of magnitude under the ~25 ft band the project treats as a real stray, and above GPS scatter; (b) keep 3 ft for a route's own geometry but exempt TRANSFER HOPS specifically (the documented legitimate case: a step between two lines real parties walked); (c) leave it and accept that composed routes carry a per-report fidelity_max_ft. Claude's recommendation is (b): it targets exactly the physically-meaningless case and leaves a genuinely shaved corner failing, which is what the gate exists to catch. |
| ✦ open | gate-published-routes-for-access — Gate PUBLISHED recommended routes against restricted land, not just composer proposals. Today osm_access protects new composer output; the 67 routes already published have never been checked, and only jacque_peak has been swept. | scripts/sweep_osm_access.py (exists) + a check_route_access.py (does not) |
compose_best_route is a proposal tool that Kyle reviews; the published routes are what he actually navigates from. A route through private land or a ski area is the one class of defect with consequences off the mountain. Needs a fleet access sweep first, and the gate must report an unswept slug as UNKNOWN rather than passing it — absence of a polygon is absence of mapping, not permission. |
Gates that run¶
All 45 wired checks. A gate with no failing report is measured and clean — not skipped.
| Gate | What it checks | Scope | Failing |
|---|---|---|---|
check_gpx_wellformed.py |
every GPX in the slug parses as XML | per-report | ✓ none |
check_source_coverage.py |
3-source GPX present | per-report | ✓ none |
check_provenance_sources.py |
provenance note NAMES its sources | per-report | ✓ none |
check_report_ready.py |
th/class/status provenance | per-report | ✓ none |
check_drive_time.py |
drive_time/drive_h present, not a placeholder | per-report | ✓ none |
check_class.py |
class ≥ hardest summit | per-report | ✓ none |
check_route_stats.py |
headline mileage matches GPX | per-report | ✓ none |
check_route_summits.py |
route reaches each summit | per-report | ✓ none |
summit_from_tracks.py |
summit marker on its track-located summit (≤200 ft) | per-report | ✓ none |
check_summit_markers.py |
summit marker vs track dwell-medoid (outlier bar, not summit accuracy) | per-report | ✓ none |
check_summit_marker_dupes.py |
no summit drawn twice at different coords | per-report | ✓ none |
check_route_exists.py |
has a recommended route | per-report | ✓ none |
check_route_recipe.py |
route reproducible from peaks.yml recipe | per-report | 3 — baldy_lejos_trio, chipeta_mtn, wayah_group |
check_beta_provenance.py |
class rating traces to a cached beta page | per-report | 45 — baldy_lejos_trio, belleview_mtn_a, campbell_creek_pk, carter_dome_group, chief_mtn_a, cimarron_six, conundrum_creek_six, dolores_middle_peak, gold_basin_trip, gold_dust_group, henry_mountain, hesperus_lavender_babcock, hunts_peak, keller_mtn, mount_adams_trio, mount_owen_b, mt_daly_a, mt_silverthorne, partner_peaks, peak_c_peak_g, pearl_oyster, pennsylvania_mountain, pk_q_pk_r, pk_z_x_solitude, powell_eagles_nest, precarious_cassi_13260, pt_13026_13408, pt_13100_13089, pt_13180_a, pt_13308_13166, pt_13557, red_peak_gore, rio_grande_pyramid_three, rito_alto_group, siberia_pk, snowdon_group, south_river_peak, teocalli_mtn, treasure_treasury, trinchera_group, valhalla_snow, wayah_group, west_elk_pk, west_willow_la_garita, white_rock_white_bm |
check_route_determinism.py |
route changes trace to new data or a tooling change | per-report | ✓ none |
check_route_sources.py |
recipe tracks are recordings, not drawn lines | per-report | 3 — henry_mountain, pt_13180_a, south_river_peak |
check_day_anchors.py |
every day in a multi-trailhead report names its start | per-report | 3 — gold_basin_trip, gold_dust_group, south_san_juans_3day |
check_route_gap_loss.py |
route draws its whole distance (no ground lost in seg breaks) | per-report | 1 — rito_alto_group |
check_route_composition.py |
a stitched (composed_segments) line was considered | per-report | 19 — carter_dome_group, chipeta_mtn, cimarron_six, fairview_peak, gladstone_peak, gold_basin_trip, gold_dust_group, henry_mountain, jacque_peak, mount_adams_trio, partner_peaks, pennsylvania_mountain, pt_13026_13408, pt_13308_13166, rio_grande_pyramid_three, rito_alto_group, south_river_peak, trinchera_group, wayah_group |
check_route_fidelity.py |
route follows real tracks (≤3 ft; per-report route_accepted.yml / fidelity_max_ft exempt) | per-report | 1 — pt_13100_13089 |
check_route_density.py |
route is dense enough to SHOW the walked line, not approximate it (mapped-osm + route_density_ok exempt) | per-report | 7 — carter_dome_group, clohesey_four, gold_basin_trip, mount_adams_trio, pt_13100_13089, rito_alto_group, star_peak_a |
check_route_gain_plausible.py |
a day's gain is possible on its mountain (floor = TH→summit rise; no doubling) | per-report | ✓ none |
check_route_access.py |
published route does not cross restricted land (swept + clear, or per-report accept_access.py) | per-report | 46 — belleview_mtn_a, campbell_creek_pk, carter_dome_group, chief_mtn_a, clohesey_four, conundrum_creek_six, dolores_middle_peak, gold_basin_trip, gold_dust_group, henry_mountain, hesperus_lavender_babcock, hunts_peak, keller_mtn, mount_adams_trio, mount_owen_b, mt_daly_a, mt_silverthorne, music_pass_3day, partner_peaks, peak_c_peak_g, pearl_oyster, pennsylvania_mountain, pk_q_pk_r, pk_z_x_solitude, powell_eagles_nest, precarious_cassi_13260, pt_13026_13408, pt_13100_13089, pt_13180_a, pt_13308_13166, pt_13557, red_peak_gore, rio_grande_pyramid_three, rito_alto_group, siberia_pk, snowdon_group, south_river_peak, star_peak_a, teocalli_mtn, treasure_treasury, trinchera_group, valhalla_snow, wayah_group, west_elk_pk, west_willow_la_garita, white_rock_white_bm |
check_kyle_recording.py |
a CLIMBED objective has Kyle's own recording in the pool (per-report kyle_recording_absent: exempt) | per-report | ✓ none |
check_beta_completeness.py |
required beta source cached or VERIFIED absent (climb13ers for CO; evidence-bearing absent records only) | per-report | 30 — baldy_lejos_trio, belleview_mtn_a, campbell_creek_pk, chief_mtn_a, clohesey_four, dolores_middle_peak, gold_dust_group, hesperus_lavender_babcock, hunts_peak, keller_mtn, mount_adams_trio, mount_owen_b, mt_daly_a, mt_silverthorne, partner_peaks, peak_c_peak_g, pearl_oyster, pennsylvania_mountain, pk_q_pk_r, pk_z_x_solitude, pt_13100_13089, pt_13308_13166, pt_13557, red_peak_gore, siberia_pk, teocalli_mtn, valhalla_snow, wayah_group, west_elk_pk, west_willow_la_garita |
check_climb13ers_url.py |
a cited climb13ers page belongs to one of THIS report's peaks (peak_db climb13ers_url) | per-report | ✓ none |
check_beta_absent.py |
a recorded climb13ers absence is not contradicted by peak_db (a false absence satisfies check_beta_completeness) | per-report | 16 — baldy_lejos_trio, chipeta_mtn, clohesey_four, mount_adams_trio, partner_peaks, peak_c_peak_g, pk_q_pk_r, pk_z_x_solitude, precarious_cassi_13260, pt_13100_13089, pt_13308_13166, rio_grande_pyramid_three, rito_alto_group, trinchera_group, valhalla_snow, wayah_group |
check_authored_route.py |
a route Kyle built by hand is frozen AND committed (an authored line must survive rebuilds and clones) | per-report | ✓ none |
check_route_starts.py |
single-day route starts at its trailhead | per-report | ✓ none |
check_drive_directions.py |
the drive link ends where the recommended route starts | per-report | 3 — baldy_lejos_trio, homestake_peak, pt_13308_13166 |
check_trip_continuity.py |
no foreign summits; trip legs chain TH→camp→TH | per-report | ✓ none |
audit_route_excursions.py |
no out-and-back excursion that reaches no objective | per-report | ✓ none |
check_route_bubbles.py |
no corridor covered twice from two different recordings | per-report | ✓ none |
track_seasons.py |
recommended route is not built from a Nov-May recording | per-report | ✓ none |
check_route_plausible.py |
route distance is plausible vs full-coverage recordings | per-report | ✓ none |
check_route_drawn.py |
route is one followable line and links summits without a needless drop | per-report | 5 — cimarron_six, mount_adams_trio, partner_peaks, pt_13026_13408, rio_grande_pyramid_three |
protected_deviation.py |
any protected deviation records who asked, when, and their words | per-report | ✓ none |
check_route_integrity.py |
route's stated length matches its line; no unbridged gaps | per-report | ✓ none |
check_report_stats.py |
frontmatter/days_detail/routes agree on dist+gain | per-report | 3 — gladstone_peak, gold_basin_trip, siberia_pk |
check_caltopo_complete.py |
CalTopo map has all recommended routes + source tracks (local-only; skips w/o dump) | per-report | ✓ none |
check_map_fresh.py |
PNG not stale vs route/tracks | per-report | ✓ none |
check_orchestrated_build.py |
report was built by the rebuild orchestrator | per-report | 29 — baldy_lejos_trio, carter_dome_group, cimarron_six, clohesey_four, conundrum_creek_six, gladstone_peak, gold_basin_trip, henry_mountain, mount_adams_trio, music_pass_3day, partner_peaks, peak_c_peak_g, pk_q_pk_r, pk_z_x_solitude, powell_eagles_nest, precarious_cassi_13260, pt_13026_13408, pt_13100_13089, pt_13180_a, pt_13308_13166, rio_grande_pyramid_three, rito_alto_group, snowdon_group, south_river_peak, treasure_treasury, trinchera_group, valhalla_snow, wayah_group, white_rock_white_bm |
check_maps.py |
map QA | repo-wide | ✓ none |
check_map_extents.py |
map extents | repo-wide | ✓ none |
check_map_labels.py |
map labels | repo-wide | ✓ none |
Out of compliance¶
| Report | Failing gate(s) | Remedy |
|---|---|---|
baldy_lejos_trio |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_drive_directions.pycheck_orchestrated_build.pycheck_route_recipe.py |
rebuild with current scripts; record/repair the route_build recipe so it reproduces the committed route |
belleview_mtn_a |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
campbell_creek_pk |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
carter_dome_group |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_density.py |
rebuild with current scripts |
chief_mtn_a |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
chipeta_mtn |
check_beta_absent.pycheck_route_composition.pycheck_route_recipe.py |
rebuild with current scripts; record/repair the route_build recipe so it reproduces the committed route |
cimarron_six |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_composition.pycheck_route_drawn.py |
rebuild with current scripts |
clohesey_four |
check_beta_absent.pycheck_beta_completeness.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_density.py |
rebuild with current scripts |
conundrum_creek_six |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
crestolita_broken_hand |
check_ruling_recorded.py |
rebuild with current scripts |
dolores_middle_peak |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
fairview_peak |
check_route_composition.py |
rebuild with current scripts |
gladstone_peak |
check_orchestrated_build.pycheck_report_stats.pycheck_route_composition.py |
rebuild with current scripts; rebuild — headline stats are regenerated from the route |
gold_basin_trip |
check_beta_provenance.pycheck_day_anchors.pycheck_orchestrated_build.pycheck_report_stats.pycheck_route_access.pycheck_route_composition.pycheck_route_density.py |
rebuild with current scripts; rebuild — headline stats are regenerated from the route |
gold_dust_group |
check_beta_completeness.pycheck_beta_provenance.pycheck_day_anchors.pycheck_route_access.pycheck_route_composition.py |
rebuild with current scripts |
graystone_electric_garfield |
backfill_dist_mi.py |
rebuild with current scripts |
henry_mountain |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_sources.py |
rebuild with current scripts |
hesperus_lavender_babcock |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
homestake_peak |
check_drive_directions.py |
rebuild with current scripts |
hunts_peak |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
italian_mountain |
backfill_dist_mi.py |
rebuild with current scripts |
jacque_peak |
check_route_composition.py |
rebuild with current scripts |
jupiter_pigeon_turret |
check_recipe_artifacts.py |
rebuild with current scripts |
keller_mtn |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
lakes_of_clouds_loop |
backfill_dist_mi.py |
rebuild with current scripts |
malemute_pk |
check_ruling_recorded.py |
rebuild with current scripts |
mount_adams_trio |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_density.pycheck_route_drawn.py |
rebuild with current scripts |
mount_owen_b |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
mt_daly_a |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
mt_silverthorne |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
music_pass_3day |
check_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
partner_peaks |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_drawn.py |
rebuild with current scripts |
peak_c_peak_g |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
pearl_oyster |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
pennsylvania_mountain |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.pycheck_route_composition.py |
rebuild with current scripts |
pk_q_pk_r |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
pk_z_x_solitude |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
powell_eagles_nest |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
precarious_cassi_13260 |
check_beta_absent.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
pt_13026_13408 |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_drawn.py |
rebuild with current scripts |
pt_13100_13089 |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_density.pycheck_route_fidelity.py |
rebuild with current scripts; rebuild the route; if a small stray is genuinely fine, record it with accept_route.py |
pt_13180_a |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_sources.py |
rebuild with current scripts |
pt_13308_13166 |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_drive_directions.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.py |
rebuild with current scripts |
pt_13557 |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
pt_13569_13226 |
check_ruling_recorded.py |
rebuild with current scripts |
red_peak_gore |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
rio_grande_pyramid_three |
check_beta_absent.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_drawn.py |
rebuild with current scripts |
rito_alto_group |
check_beta_absent.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_density.pycheck_route_gap_loss.py |
rebuild with current scripts |
siberia_pk |
check_beta_completeness.pycheck_beta_provenance.pycheck_report_stats.pycheck_route_access.py |
rebuild with current scripts; rebuild — headline stats are regenerated from the route |
snowdon_group |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
south_river_peak |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_sources.py |
rebuild with current scripts |
south_san_juans_3day |
check_day_anchors.py |
rebuild with current scripts |
star_peak_a |
check_route_access.pycheck_route_density.py |
rebuild with current scripts |
teocalli_mtn |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
treasure_treasury |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
trinchera_group |
check_beta_absent.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.py |
rebuild with current scripts |
v3 |
check_ruling_recorded.py |
rebuild with current scripts |
valhalla_snow |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
vestal_arrow_trinities |
check_ruling_recorded.py |
rebuild with current scripts |
wayah_group |
check_beta_absent.pycheck_beta_completeness.pycheck_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.pycheck_route_composition.pycheck_route_recipe.py |
rebuild with current scripts; record/repair the route_build recipe so it reproduces the committed route |
west_elk_pk |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
west_willow_la_garita |
check_beta_completeness.pycheck_beta_provenance.pycheck_route_access.py |
rebuild with current scripts |
white_rock_white_bm |
check_beta_provenance.pycheck_orchestrated_build.pycheck_route_access.py |
rebuild with current scripts |
Detail¶
baldy_lejos_trio
check_beta_absent.py- FAIL baldy_lejos_trio: claims climb13ers absent, but peak_db has 3 page(s): 714 "Baldy Lejos" → https://www.climb13ers.com/colorado-13ers/un13100--e--baldy-lejos; 701 PT 13,115 → https://www.climb13ers.com/colorado-13ers/un13111; 788 PT 13,030 → https://www.climb13ers.com/colorado-13ers/un13034 · recorded 2026-08-13T18:29:25Z
check_beta_completeness.py- FAIL baldy_lejos_trio: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL baldy_lejos_trio: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL baldy_lejos_trio: class_source cites no URL — a safety-critical grade must name the page it came from
check_drive_directions.py- FAIL baldy_lejos_trio: the drive link ends at 37.84913,-106.92766 but the recommended route starts 7.64 mi away at 37.95573,-106.96519 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
- FAIL baldy_lejos_trio: the drive link ends at 37.84913,-106.92766 but the recommended route starts 7.64 mi away at 37.95573,-106.96519 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
check_orchestrated_build.py- FAIL baldy_lejos_trio: no orchestrated-build record in gpx/baldy_lejos_trio/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py baldy_lejos_trio --start).
check_route_recipe.py- FAIL baldy_lejos_trio legs recipe does NOT reproduce committed route (recipe 13.3 mi vs 11.8 mi) [28.6s]
belleview_mtn_a
check_beta_completeness.py- FAIL belleview_mtn_a: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL belleview_mtn_a: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL belleview_mtn_a: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL belleview_mtn_a: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL belleview_mtn_a: class_source cites https://www.climb13ers.com/colorado-13ers/belleview-mountain but NO beta is cached for this slug (gpx/belleview_mtn_a/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL belleview_mtn_a: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug belleview_mtn_a
campbell_creek_pk
check_beta_completeness.py- FAIL campbell_creek_pk: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL campbell_creek_pk: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL campbell_creek_pk: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL campbell_creek_pk: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL campbell_creek_pk: class_source cites https://www.climb13ers.com/colorado-13ers/un-13454--campbell-creek-peak but NO beta is cached for this slug (gpx/campbell_creek_pk/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL campbell_creek_pk: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug campbell_creek_pk
carter_dome_group
check_beta_provenance.py- FAIL carter_dome_group: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL carter_dome_group: no orchestrated-build record in gpx/carter_dome_group/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py carter_dome_group --start).
check_route_access.py- FAIL carter_dome_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug carter_dome_group
check_route_composition.py- FAIL carter_dome_group method 'frozen' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL carter_dome_group method 'frozen' and no
check_route_density.py- FAIL carter_dome_group: carter_dome_group_recommended.gpx: max point gap 1,025 ft (bar 400), 0.9% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
chief_mtn_a
check_beta_completeness.py- FAIL chief_mtn_a: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL chief_mtn_a: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL chief_mtn_a: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL chief_mtn_a: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL chief_mtn_a: class_source cites https://www.climb13ers.com/colorado-13ers/chief-mountain but NO beta is cached for this slug (gpx/chief_mtn_a/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL chief_mtn_a: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug chief_mtn_a
chipeta_mtn
check_beta_absent.py- FAIL chipeta_mtn: claims climb13ers absent, but peak_db has 1 page(s): 337 Chipeta Mountain → https://www.climb13ers.com/colorado-13ers/chipeta-mountain · recorded 2026-08-13T00:16:05Z
check_route_composition.py- FAIL chipeta_mtn method 'graph' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL chipeta_mtn method 'graph' and no
check_route_recipe.py- FAIL chipeta_mtn graph recipe did not build — Traceback (most recent call last): [8.3s]
cimarron_six
check_beta_provenance.py- FAIL cimarron_six: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL cimarron_six: no orchestrated-build record in gpx/cimarron_six/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py cimarron_six --start).
check_route_composition.py- FAIL cimarron_six method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL cimarron_six method 'legs' and no
check_route_drawn.py- FAIL cimarron_six Heisshorn → PT 13,382: drops to 12,667 ft between summits 0.5 mi apart — 334 ft BELOW the 13,001 ft saddle that links them, then re-climbs 699 ft
clohesey_four
check_beta_absent.py- FAIL clohesey_four: claims climb13ers absent, but peak_db has 4 page(s): 145 "Magdalene Mountain" → https://www.climb13ers.com/colorado-13ers/un13762--silver-king-peak; 347 "Pear Peak" → https://www.climb13ers.com/colorado-13ers/un-13462--pear-peak; 303 PT 13,517 A → https://www.climb13ers.com/colorado-13ers/un-13517; 339 PT 13,486 → https://www.climb13ers.com/colorado-13ers/un-13486 · recorded 2026-08-13T18:28:01Z
check_beta_completeness.py- FAIL clohesey_four: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL clohesey_four: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_orchestrated_build.py- FAIL clohesey_four: no orchestrated-build record in gpx/clohesey_four/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py clohesey_four --start).
check_route_access.py- FAIL clohesey_four: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug clohesey_four
check_route_density.py- FAIL clohesey_four: clohesey_four_recommended.gpx: max point gap 1,651 ft (bar 400), 88.6% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
conundrum_creek_six
check_beta_provenance.py- FAIL conundrum_creek_six: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL conundrum_creek_six: no orchestrated-build record in gpx/conundrum_creek_six/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py conundrum_creek_six --start).
check_route_access.py- FAIL conundrum_creek_six: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug conundrum_creek_six
crestolita_broken_hand
check_ruling_recorded.py- FAIL crestolita_broken_hand: peaks.yml records a decision of Kyle's in a COMMENT with no deviation to carry it — the next rebuild will ask him again. 2 line(s), first: # ACCEPTED, reasoned and per-report (Kyle, 2026-08-04, after seeing the flagged stretches on a
dolores_middle_peak
check_beta_completeness.py- FAIL dolores_middle_peak: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL dolores_middle_peak: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL dolores_middle_peak: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL dolores_middle_peak: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL dolores_middle_peak: class_source cites https://www.climb13ers.com/colorado-13ers/dolores-peak but NO beta is cached for this slug (gpx/dolores_middle_peak/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL dolores_middle_peak: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug dolores_middle_peak
fairview_peak
check_route_composition.py- FAIL fairview_peak method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL fairview_peak method 'from_track' and no
gladstone_peak
check_orchestrated_build.py- FAIL gladstone_peak: no orchestrated-build record in gpx/gladstone_peak/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py gladstone_peak --start).
check_report_stats.py- FAIL gladstone_peak
check_route_composition.py- FAIL gladstone_peak method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL gladstone_peak method 'legs' and no
gold_basin_trip
check_beta_provenance.py- FAIL gold_basin_trip: class_source cites no URL — a safety-critical grade must name the page it came from
check_day_anchors.py- FAIL gold_basin_trip: day 'fairview' has no
start:but the report declares 2 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Gold Basin 4WD (Fairview, upper) (38.6709,-106.5375), Gold Creek / Gold Basin SE TH (Henry) (38.6559,-106.5756) - FAIL gold_basin_trip: day 'henry' has no
start:but the report declares 2 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Gold Basin 4WD (Fairview, upper) (38.6709,-106.5375), Gold Creek / Gold Basin SE TH (Henry) (38.6559,-106.5756)
- FAIL gold_basin_trip: day 'fairview' has no
check_orchestrated_build.py- FAIL gold_basin_trip: no orchestrated-build record in gpx/gold_basin_trip/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py gold_basin_trip --start).
check_report_stats.py- FAIL gold_basin_trip
check_route_access.py- FAIL gold_basin_trip: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug gold_basin_trip
check_route_composition.py- FAIL gold_basin_trip day 'fairview': method '(none)' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated - FAIL gold_basin_trip day 'henry': method '(none)' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL gold_basin_trip day 'fairview': method '(none)' and no
check_route_density.py- FAIL gold_basin_trip: day_fairview_recommended.gpx: max point gap 201 ft (bar 400), 3.8% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
gold_dust_group
check_beta_completeness.py- FAIL gold_dust_group: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL gold_dust_group: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL gold_dust_group: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL gold_dust_group: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL gold_dust_group: class_source cites https://www.climb13ers.com/colorado-13ers/un-13346--finnegan-peak but NO beta is cached for this slug (gpx/gold_dust_group/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_day_anchors.py- FAIL gold_dust_group: day 'gold_dust_pika' has no
start:but the report declares 2 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Fulford Cave / Lake Charles TH (39.49225,-106.65922), New York Mountain TH (39.52202,-106.63043) - FAIL gold_dust_group: day 'finnegan' has no
start:but the report declares 2 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Fulford Cave / Lake Charles TH (39.49225,-106.65922), New York Mountain TH (39.52202,-106.63043)
- FAIL gold_dust_group: day 'gold_dust_pika' has no
check_route_access.py- FAIL gold_dust_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug gold_dust_group
check_route_composition.py- FAIL gold_dust_group day 'finnegan': method '(none)' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL gold_dust_group day 'finnegan': method '(none)' and no
graystone_electric_garfield
backfill_dist_mi.py- FAIL graystone_electric_garfield: graystone_electric_garfield.md: 19.1 mi (STALE, frontmatter says 18.3)
henry_mountain
check_beta_provenance.py- FAIL henry_mountain: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL henry_mountain: no orchestrated-build record in gpx/henry_mountain/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py henry_mountain --start).
check_route_access.py- FAIL henry_mountain: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug henry_mountain
check_route_composition.py- FAIL henry_mountain method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL henry_mountain method 'from_track' and no
check_route_sources.py- FAIL henry_mountain: recipe names pb_1.gpx but the file is missing
hesperus_lavender_babcock
check_beta_completeness.py- FAIL hesperus_lavender_babcock: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL hesperus_lavender_babcock: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL hesperus_lavender_babcock: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL hesperus_lavender_babcock: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL hesperus_lavender_babcock: class_source cites https://www.climb13ers.com/colorado-13ers/babcock-peak but NO beta is cached for this slug (gpx/hesperus_lavender_babcock/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL hesperus_lavender_babcock: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug hesperus_lavender_babcock
homestake_peak
check_drive_directions.py- FAIL homestake_peak: the drive link ends at 39.34946,-106.35979 but the recommended route starts 2.22 mi away at 39.37216,-106.38921 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
- FAIL homestake_peak: the drive link ends at 39.34946,-106.35979 but the recommended route starts 2.22 mi away at 39.37216,-106.38921 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
hunts_peak
check_beta_completeness.py- FAIL hunts_peak: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL hunts_peak: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL hunts_peak: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL hunts_peak: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL hunts_peak: class_source cites no URL — a safety-critical grade must name the page it came from
check_route_access.py- FAIL hunts_peak: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug hunts_peak
italian_mountain
backfill_dist_mi.py- FAIL italian_mountain: italian_mountain.md: 10.7 mi (STALE, frontmatter says 11.0)
jacque_peak
check_route_composition.py- FAIL jacque_peak method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL jacque_peak method 'from_track' and no
jupiter_pigeon_turret
check_recipe_artifacts.py- FAIL jupiter_pigeon_turret: legs[0] 'Pack-in' targets camp_chicago_target_peaks_only.gpx, which does not exist and cannot be derived (no camp landmarks). This report FAILS at the route phase of its next rebuild. Fix: add
target_latlon: "<lat>,<lon>"to the leg, or give peaks.yml exactly onekind: camplandmark. - FAIL jupiter_pigeon_turret: legs[1] 'Camp move' targets camp_ruby_target_peaks_only.gpx, which does not exist and cannot be derived (no camp landmarks). This report FAILS at the route phase of its next rebuild. Fix: add
target_latlon: "<lat>,<lon>"to the leg, or give peaks.yml exactly onekind: camplandmark. - FAIL jupiter_pigeon_turret: legs[2] 'Pack-out' targets camp_ruby_target_peaks_only.gpx, which does not exist and cannot be derived (no camp landmarks). This report FAILS at the route phase of its next rebuild. Fix: add
target_latlon: "<lat>,<lon>"to the leg, or give peaks.yml exactly onekind: camplandmark.
- FAIL jupiter_pigeon_turret: legs[0] 'Pack-in' targets camp_chicago_target_peaks_only.gpx, which does not exist and cannot be derived (no camp landmarks). This report FAILS at the route phase of its next rebuild. Fix: add
keller_mtn
check_beta_completeness.py- FAIL keller_mtn: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL keller_mtn: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL keller_mtn: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL keller_mtn: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL keller_mtn: class_source cites https://www.climb13ers.com/colorado-13ers/keller-mountain but NO beta is cached for this slug (gpx/keller_mtn/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL keller_mtn: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug keller_mtn
lakes_of_clouds_loop
backfill_dist_mi.py- FAIL lakes_of_clouds_loop: lakes_of_clouds_loop.emily.md: 18.8 mi (STALE, frontmatter says 22.8)
malemute_pk
check_ruling_recorded.py- FAIL malemute_pk: peaks.yml records a decision of Kyle's in a COMMENT with no deviation to carry it — the next rebuild will ask him again. 1 line(s), first: # Re-run cause (Kyle, 2026-08-07): the previous run's route rode trk_loj_904, which turned
mount_adams_trio
check_beta_absent.py- FAIL mount_adams_trio: claims climb13ers absent, but peak_db has 3 page(s): 277 PT 13,552 → https://www.climb13ers.com/colorado-13ers/un-13546; 248 Pt 13,580A → https://www.climb13ers.com/colorado-13ers/un-13580--un-13580-b; 280 PT 13,543 → https://www.climb13ers.com/colorado-13ers/un-13541 · recorded 2026-08-13T06:46:57Z
check_beta_completeness.py- FAIL mount_adams_trio: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL mount_adams_trio: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL mount_adams_trio: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL mount_adams_trio: no orchestrated-build record in gpx/mount_adams_trio/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py mount_adams_trio --start).
check_route_access.py- FAIL mount_adams_trio: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug mount_adams_trio
check_route_composition.py- FAIL mount_adams_trio method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL mount_adams_trio method 'legs' and no
check_route_density.py- FAIL mount_adams_trio: mount_adams_trio_recommended.gpx: max point gap 704 ft (bar 400), 0.8% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
check_route_drawn.py- FAIL mount_adams_trio PT 13,552 → Pt 13,580A: drops to 12,424 ft between summits 1.0 mi apart — 457 ft BELOW the 12,881 ft saddle that links them, then re-climbs 1,069 ft
mount_owen_b
check_beta_completeness.py- FAIL mount_owen_b: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL mount_owen_b: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL mount_owen_b: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL mount_owen_b: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL mount_owen_b: class_source cites https://www.climb13ers.com/colorado-13ers/mount-owen-2 but NO beta is cached for this slug (gpx/mount_owen_b/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL mount_owen_b: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug mount_owen_b
mt_daly_a
check_beta_completeness.py- FAIL mt_daly_a: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL mt_daly_a: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL mt_daly_a: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL mt_daly_a: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL mt_daly_a: class_source cites https://listsofjohn.com/class?Id=490 but NO beta is cached for this slug (gpx/mt_daly_a/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL mt_daly_a: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug mt_daly_a
mt_silverthorne
check_beta_completeness.py- FAIL mt_silverthorne: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL mt_silverthorne: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL mt_silverthorne: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL mt_silverthorne: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL mt_silverthorne: class_source cites https://www.climb13ers.com/colorado-13ers/willow-benchmark--mount-silverthorne. but NO beta is cached for this slug (gpx/mt_silverthorne/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL mt_silverthorne: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug mt_silverthorne
music_pass_3day
check_orchestrated_build.py- FAIL music_pass_3day: no orchestrated-build record in gpx/music_pass_3day/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py music_pass_3day --start).
check_route_access.py- FAIL music_pass_3day: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug music_pass_3day
partner_peaks
check_beta_absent.py- FAIL partner_peaks: claims climb13ers absent, but peak_db has 2 page(s): 781 "West Partner Peak" → https://www.climb13ers.com/colorado-13ers/un13041--a--west-partner-peak; 768 "East Partner Peak" → https://www.climb13ers.com/colorado-13ers/un13057--east-partner-peak · recorded 2026-08-13T06:55:28Z
check_beta_completeness.py- FAIL partner_peaks: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL partner_peaks: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL partner_peaks: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL partner_peaks: no orchestrated-build record in gpx/partner_peaks/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py partner_peaks --start).
check_route_access.py- FAIL partner_peaks: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug partner_peaks
check_route_composition.py- FAIL partner_peaks method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL partner_peaks method 'from_track' and no
check_route_drawn.py- FAIL partner_peaks East Partner Pk → West Partner Pk: drops to 12,070 ft between summits 0.9 mi apart — 404 ft BELOW the 12,474 ft saddle that links them, then re-climbs 738 ft
peak_c_peak_g
check_beta_absent.py- FAIL peak_c_peak_g: claims climb13ers absent, but peak_db has 2 page(s): 574 "Peak C" → https://www.climb13ers.com/colorado-13ers/un13220--b--peak-c; 533 "Peak G" → https://www.climb13ers.com/colorado-13ers/un13260--c--peak-g · recorded 2026-08-13T06:59:49Z
check_beta_completeness.py- FAIL peak_c_peak_g: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL peak_c_peak_g: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL peak_c_peak_g: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL peak_c_peak_g: no orchestrated-build record in gpx/peak_c_peak_g/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py peak_c_peak_g --start).
check_route_access.py- FAIL peak_c_peak_g: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug peak_c_peak_g
pearl_oyster
check_beta_completeness.py- FAIL pearl_oyster: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL pearl_oyster: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL pearl_oyster: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL pearl_oyster: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL pearl_oyster: class_source cites https://www.climb13ers.com/colorado-13ers/pearl-mountain but NO beta is cached for this slug (gpx/pearl_oyster/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL pearl_oyster: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pearl_oyster
pennsylvania_mountain
check_beta_completeness.py- FAIL pennsylvania_mountain: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL pennsylvania_mountain: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL pennsylvania_mountain: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL pennsylvania_mountain: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL pennsylvania_mountain: class_source cites no URL — a safety-critical grade must name the page it came from
check_route_access.py- FAIL pennsylvania_mountain: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pennsylvania_mountain
check_route_composition.py- FAIL pennsylvania_mountain method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL pennsylvania_mountain method 'from_track' and no
pk_q_pk_r
check_beta_absent.py- FAIL pk_q_pk_r: claims climb13ers absent, but peak_db has 2 page(s): 563 "Peak Q" → https://www.climb13ers.com/colorado-13ers/un13230--b--peak-q; 819 Peak R → https://www.climb13ers.com/colorado-13ers/peak-r--slate-creek · recorded 2026-08-13T07:03:44Z
check_beta_completeness.py- FAIL pk_q_pk_r: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL pk_q_pk_r: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL pk_q_pk_r: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL pk_q_pk_r: no orchestrated-build record in gpx/pk_q_pk_r/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pk_q_pk_r --start).
check_route_access.py- FAIL pk_q_pk_r: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pk_q_pk_r
pk_z_x_solitude
check_beta_absent.py- FAIL pk_z_x_solitude: claims climb13ers absent, but peak_db has 3 page(s): 548 "Peak Z" → https://www.climb13ers.com/colorado-13ers/un13245--peak-z; 733 "Peak X" → https://www.climb13ers.com/colorado-13ers/un13085--b--peak-x; 727 "Mount Solitude" → https://www.climb13ers.com/colorado-13ers/un13090--b--mount-solitude · recorded 2026-08-13T07:07:38Z
check_beta_completeness.py- FAIL pk_z_x_solitude: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL pk_z_x_solitude: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL pk_z_x_solitude: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL pk_z_x_solitude: no orchestrated-build record in gpx/pk_z_x_solitude/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pk_z_x_solitude --start).
check_route_access.py- FAIL pk_z_x_solitude: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pk_z_x_solitude
powell_eagles_nest
check_beta_provenance.py- FAIL powell_eagles_nest: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL powell_eagles_nest: no orchestrated-build record in gpx/powell_eagles_nest/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py powell_eagles_nest --start).
check_route_access.py- FAIL powell_eagles_nest: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug powell_eagles_nest
precarious_cassi_13260
check_beta_absent.py- FAIL precarious_cassi_13260: claims climb13ers absent, but peak_db has 3 page(s): 414 Precarious Peak → https://www.climb13ers.com/colorado-13ers/precarious-peak; 560 "Cassi Peak" → https://www.climb13ers.com/colorado-13ers/un13232--b--cassi-peak; 535 "Golden Tops" → https://www.climb13ers.com/colorado-13ers/un13260--b · recorded 2026-08-13T07:16:30Z
check_beta_provenance.py- FAIL precarious_cassi_13260: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL precarious_cassi_13260: no orchestrated-build record in gpx/precarious_cassi_13260/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py precarious_cassi_13260 --start).
check_route_access.py- FAIL precarious_cassi_13260: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug precarious_cassi_13260
pt_13026_13408
check_beta_provenance.py- FAIL pt_13026_13408: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL pt_13026_13408: no orchestrated-build record in gpx/pt_13026_13408/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pt_13026_13408 --start).
check_route_access.py- FAIL pt_13026_13408: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pt_13026_13408
check_route_composition.py- FAIL pt_13026_13408 method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL pt_13026_13408 method 'legs' and no
check_route_drawn.py- FAIL pt_13026_13408 PT 13,408 → PT 13,026: drops to 11,319 ft between summits 1.3 mi apart — 1,392 ft BELOW the 12,711 ft saddle that links them, then re-climbs 2,100 ft
pt_13100_13089
check_beta_absent.py- FAIL pt_13100_13089: claims climb13ers absent, but peak_db has 2 page(s): 711 PT 13,100 A → https://www.climb13ers.com/colorado-13ers/un13100--un13100-b; 732 "Ribbed Peak" → https://www.climb13ers.com/colorado-13ers/un13085--a--ribbed-peak · recorded 2026-08-13T07:29:59Z
check_beta_completeness.py- FAIL pt_13100_13089: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL pt_13100_13089: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL pt_13100_13089: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL pt_13100_13089: no orchestrated-build record in gpx/pt_13100_13089/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pt_13100_13089 --start).
check_route_access.py- FAIL pt_13100_13089: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pt_13100_13089
check_route_density.py- FAIL pt_13100_13089: pt_13100_13089_recommended.gpx: max point gap 1,362 ft (bar 400), 0.9% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
check_route_fidelity.py- FAIL pt_13100_13089 strays >120 ft (un-accepted) — run inspect_route.py pt_13100_13089
pt_13180_a
check_beta_provenance.py- FAIL pt_13180_a: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL pt_13180_a: no orchestrated-build record in gpx/pt_13180_a/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pt_13180_a --start).
check_route_access.py- FAIL pt_13180_a: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pt_13180_a
check_route_sources.py- FAIL pt_13180_a: recipe names 14ers_2.gpx but the file is missing
- FAIL pt_13180_a: recipe names loj_2582.gpx but the file is missing
pt_13308_13166
check_beta_absent.py- FAIL pt_13308_13166: claims climb13ers absent, but peak_db has 2 page(s): 510 PT 13,308 → https://www.climb13ers.com/colorado-13ers/un-13300; 648 PT 13,166 → https://www.climb13ers.com/colorado-13ers/un13155 · recorded 2026-08-13T07:43:55Z
check_beta_completeness.py- FAIL pt_13308_13166: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL pt_13308_13166: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL pt_13308_13166: class_source cites no URL — a safety-critical grade must name the page it came from
check_drive_directions.py- FAIL pt_13308_13166: the drive link ends at 37.84913,-106.92766 but the recommended route starts 7.65 mi away at 37.95544,-106.96660 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
- FAIL pt_13308_13166: the drive link ends at 37.84913,-106.92766 but the recommended route starts 7.65 mi away at 37.95544,-106.96660 — following the directions leaves you short of the trailhead the report's mileage assumes. Re-run scripts/write_report.py (the link is generated from peaks.yml's trailhead) or fix the trailhead.
check_orchestrated_build.py- FAIL pt_13308_13166: no orchestrated-build record in gpx/pt_13308_13166/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py pt_13308_13166 --start).
check_route_access.py- FAIL pt_13308_13166: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pt_13308_13166
check_route_composition.py- FAIL pt_13308_13166 method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL pt_13308_13166 method 'legs' and no
pt_13557
check_beta_completeness.py- FAIL pt_13557: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL pt_13557: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL pt_13557: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL pt_13557: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL pt_13557: class_source cites https://www.climb13ers.com/colorado-13ers/un-13557-huerfano but NO beta is cached for this slug (gpx/pt_13557/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL pt_13557: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug pt_13557
pt_13569_13226
check_ruling_recorded.py- FAIL pt_13569_13226: peaks.yml records a decision of Kyle's in a COMMENT with no deviation to carry it — the next rebuild will ask him again. 4 line(s), first: # SCOPE: Kyle asked for PT 13,569 + PT 13,226. Beaubien and Francisco are included because the
red_peak_gore
check_beta_completeness.py- FAIL red_peak_gore: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL red_peak_gore: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL red_peak_gore: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL red_peak_gore: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL red_peak_gore: class_source cites https://www.climb13ers.com/colorado-13ers/red-peak--red-peak-b but NO beta is cached for this slug (gpx/red_peak_gore/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL red_peak_gore: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug red_peak_gore
rio_grande_pyramid_three
check_beta_absent.py- FAIL rio_grande_pyramid_three: claims climb13ers absent, but peak_db has 3 page(s): 517 "Fools Pyramid" → https://www.climb13ers.com/colorado-13ers/un13278; 532 PT 13,274 → https://www.climb13ers.com/colorado-13ers/un13261; 804 PT 13,022 → https://www.climb13ers.com/colorado-13ers/un13017 · recorded 2026-08-13T07:52:00Z
check_beta_provenance.py- FAIL rio_grande_pyramid_three: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL rio_grande_pyramid_three: no orchestrated-build record in gpx/rio_grande_pyramid_three/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py rio_grande_pyramid_three --start).
check_route_access.py- FAIL rio_grande_pyramid_three: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug rio_grande_pyramid_three
check_route_composition.py- FAIL rio_grande_pyramid_three method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL rio_grande_pyramid_three method 'from_track' and no
check_route_drawn.py- FAIL rio_grande_pyramid_three PT 13,022 → PT 13,290: drops to 12,241 ft between summits 2.7 mi apart — 392 ft BELOW the 12,633 ft saddle that links them, then re-climbs 1,053 ft
rito_alto_group
check_beta_absent.py- FAIL rito_alto_group: claims climb13ers absent, but peak_db has 4 page(s): 755 "Mas Alto Peak" → https://www.climb13ers.com/colorado-13ers/un13062--un13062--b; 759 "Alto Peak" → https://www.climb13ers.com/colorado-13ers/un13060--un13060--b; 791 "Menos Alto Peak" → https://www.climb13ers.com/colorado-13ers/un13028; 770 "Pyramid Mountain" → https://www.climb13ers.com/colorado-13ers/un13054 · recorded 2026-08-13T09:26:17Z
check_beta_provenance.py- FAIL rito_alto_group: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL rito_alto_group: no orchestrated-build record in gpx/rito_alto_group/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py rito_alto_group --start).
check_route_access.py- FAIL rito_alto_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug rito_alto_group
check_route_composition.py- FAIL rito_alto_group day 'north3': method 'from_track (verbatim
track:)' and nocomposition_reviewed:— nothing records that a stitched line was ever evaluated - FAIL rito_alto_group day 'south': method 'from_track (verbatim
track:)' and nocomposition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL rito_alto_group day 'north3': method 'from_track (verbatim
check_route_density.py- FAIL rito_alto_group: day_south_recommended.gpx: max point gap 381 ft (bar 400), 7.8% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
check_route_gap_loss.py- FAIL rito_alto_group: day_south_recommended.gpx loses 1.32 mi (11% of the 11.80 mi drawn) in 14
break(s) — every stat sums within segments, so the headline under-reports the day. Usually a coarse sample cadence misread as GPS dropouts; fix the route build, don't patch the number
- FAIL rito_alto_group: day_south_recommended.gpx loses 1.32 mi (11% of the 11.80 mi drawn) in 14
siberia_pk
check_beta_completeness.py- FAIL siberia_pk: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL siberia_pk: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL siberia_pk: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL siberia_pk: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL siberia_pk: class_source cites https://www.climb13ers.com/colorado-13ers/un-13420--siberia-peak but NO beta is cached for this slug (gpx/siberia_pk/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_report_stats.py- FAIL siberia_pk
check_route_access.py- FAIL siberia_pk: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug siberia_pk
snowdon_group
check_beta_provenance.py- FAIL snowdon_group: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL snowdon_group: no orchestrated-build record in gpx/snowdon_group/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py snowdon_group --start).
check_route_access.py- FAIL snowdon_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug snowdon_group
south_river_peak
check_beta_provenance.py- FAIL south_river_peak: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL south_river_peak: no orchestrated-build record in gpx/south_river_peak/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py south_river_peak --start).
check_route_access.py- FAIL south_river_peak: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug south_river_peak
check_route_composition.py- FAIL south_river_peak method 'from_track' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL south_river_peak method 'from_track' and no
check_route_sources.py- FAIL south_river_peak: recipe names loj_14413.gpx but the file is missing
south_san_juans_3day
check_day_anchors.py- FAIL south_san_juans_3day: day 'Day 1 — Bennett Pk' has no
start:but the report declares 3 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Bennett Pk TH (37.460199,-106.414769), Treasure Creek TH (37.3629,-106.67), Saddle Creek - Conejos TH (37.2958,-106.5387) - FAIL south_san_juans_3day: day 'Day 2 — Summit Pk + Unicorn + Montezuma' has no
start:but the report declares 3 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Bennett Pk TH (37.460199,-106.414769), Treasure Creek TH (37.3629,-106.67), Saddle Creek - Conejos TH (37.2958,-106.5387) - FAIL south_san_juans_3day: day 'Day 3 — Conejos Pk' has no
start:but the report declares 3 trailheads — the builder would silently pick one. Pin it: addstart: <lat>,<lon>to that day. Candidates: Bennett Pk TH (37.460199,-106.414769), Treasure Creek TH (37.3629,-106.67), Saddle Creek - Conejos TH (37.2958,-106.5387)
- FAIL south_san_juans_3day: day 'Day 1 — Bennett Pk' has no
star_peak_a
check_route_access.py- FAIL star_peak_a: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug star_peak_a
check_route_density.py- FAIL star_peak_a: star_peak_a_recommended.gpx: max point gap 680 ft (bar 400), 81.4% of steps over 150 ft (bar 2%) — the drawn line approximates the walked one. Pick a denser source (list_source_tracks shows per-track max-gap), compose, or record route_density_ok: in peaks.yml with why.
teocalli_mtn
check_beta_completeness.py- FAIL teocalli_mtn: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL teocalli_mtn: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL teocalli_mtn: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL teocalli_mtn: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL teocalli_mtn: class_source cites https://www.climb13ers.com/colorado-13ers/colorado-13ers-teocalli-via-west-brush-creek but NO beta is cached for this slug (gpx/teocalli_mtn/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL teocalli_mtn: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug teocalli_mtn
treasure_treasury
check_beta_provenance.py- FAIL treasure_treasury: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL treasure_treasury: no orchestrated-build record in gpx/treasure_treasury/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py treasure_treasury --start).
check_route_access.py- FAIL treasure_treasury: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug treasure_treasury
trinchera_group
check_beta_absent.py- FAIL trinchera_group: claims climb13ers absent, but peak_db has 4 page(s): 302 Trinchera Peak → https://www.climb13ers.com/colorado-13ers/trinchera-peak; 610 "Leaning South Peak" → https://www.climb13ers.com/colorado-13ers/un13203--leaning-south-peak; 329 Cuatro Peak → https://www.climb13ers.com/colorado-13ers/cuatro-peak; 454 Mount Maxwell → https://www.climb13ers.com/colorado-13ers/mount-maxwell · recorded 2026-08-13T08:29:49Z
check_beta_provenance.py- FAIL trinchera_group: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL trinchera_group: no orchestrated-build record in gpx/trinchera_group/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py trinchera_group --start).
check_route_access.py- FAIL trinchera_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug trinchera_group
check_route_composition.py- FAIL trinchera_group method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL trinchera_group method 'legs' and no
v3
check_ruling_recorded.py- FAIL v3: peaks.yml records a decision of Kyle's in a COMMENT with no deviation to carry it — the next rebuild will ask him again. 1 line(s), first: # THIS REPORT IS A SNOW CLIMB, declared (Kyle, 2026-08-04: "I've heard that v3 is better to
valhalla_snow
check_beta_absent.py- FAIL valhalla_snow: claims climb13ers absent, but peak_db has 2 page(s): 624 "Mount Valhalla" → https://www.climb13ers.com/colorado-13ers/un13180--mount-valhalla; 793 "Snow Peak" → https://www.climb13ers.com/colorado-13ers/un13024--snow-peak · recorded 2026-08-13T08:45:14Z
check_beta_completeness.py- FAIL valhalla_snow: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL valhalla_snow: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL valhalla_snow: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL valhalla_snow: no orchestrated-build record in gpx/valhalla_snow/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py valhalla_snow --start).
check_route_access.py- FAIL valhalla_snow: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug valhalla_snow
vestal_arrow_trinities
check_ruling_recorded.py- FAIL vestal_arrow_trinities: peaks.yml records a decision of Kyle's in a COMMENT with no deviation to carry it — the next rebuild will ask him again. 1 line(s), first: # One recommended route per LEG (Kyle, 2026-07-10): pack-in/out corridor + each
wayah_group
check_beta_absent.py- FAIL wayah_group: claims climb13ers absent, but peak_db has 6 page(s): 491 PT 13,291 → https://www.climb13ers.com/colorado-13ers/un-13300--un-13300-b; 511 "Wayah Peak" → https://www.climb13ers.com/colorado-13ers/un13284--wayah-peak; 611 PT 13,220 → https://www.climb13ers.com/colorado-13ers/un13202; 595 PT 13,221 → https://www.climb13ers.com/colorado-13ers/un13212; 792 PT 13,033 → https://www.climb13ers.com/colorado-13ers/un13026; 814 PT 13,014 → https://www.climb13ers.com/colorado-13ers/un13014--mt-champion · recorded 2026-08-13T08:49:20Z
check_beta_completeness.py- FAIL wayah_group: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
', bare elevation) and record the query and its result
- FAIL wayah_group: climb13ers absent-record evidence shows no SEARCH — climb13ers indexes unnamed peaks under underivable slugs (un13222--un13222--a), so a 404 on a URL you built proves nothing. Search the site (peak name, 'un
check_beta_provenance.py- FAIL wayah_group: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL wayah_group: no orchestrated-build record in gpx/wayah_group/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py wayah_group --start).
check_route_access.py- FAIL wayah_group: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug wayah_group
check_route_composition.py- FAIL wayah_group method 'legs' and no
composition_reviewed:— nothing records that a stitched line was ever evaluated
- FAIL wayah_group method 'legs' and no
check_route_recipe.py- FAIL wayah_group legs recipe does NOT reproduce committed route (recipe 17.2 mi vs 16.5 mi) [7.6s]
west_elk_pk
check_beta_completeness.py- FAIL west_elk_pk: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL west_elk_pk: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL west_elk_pk: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL west_elk_pk: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL west_elk_pk: class_source cites https://www.climb13ers.com/colorado-13ers/west-elk-peak but NO beta is cached for this slug (gpx/west_elk_pk/beta/ is empty) — the page was fetched once by an agent that has exited, so nothing can verify it
check_route_access.py- FAIL west_elk_pk: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug west_elk_pk
west_willow_la_garita
check_beta_completeness.py- FAIL west_willow_la_garita: climb13ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent climb13ers --evidence "...")
- FAIL west_willow_la_garita: 14ers beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent 14ers --evidence "...")
- FAIL west_willow_la_garita: listsofjohn beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent listsofjohn --evidence "...")
- FAIL west_willow_la_garita: peakbagger beta neither cached nor verified-absent — cache the page (ingest_beta.py --json) or record verified absence with evidence (ingest_beta.py --absent peakbagger --evidence "...")
check_beta_provenance.py- FAIL west_willow_la_garita: class_source cites no URL — a safety-critical grade must name the page it came from
check_route_access.py- FAIL west_willow_la_garita: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug west_willow_la_garita
white_rock_white_bm
check_beta_provenance.py- FAIL white_rock_white_bm: class_source cites no URL — a safety-critical grade must name the page it came from
check_orchestrated_build.py- FAIL white_rock_white_bm: no orchestrated-build record in gpx/white_rock_white_bm/workflow.json — built outside scripts/build_report.py. Remedy: rebuild it through the orchestrator (build_report.py white_rock_white_bm --start).
check_route_access.py- FAIL white_rock_white_bm: route never checked against private land — no access_osm.json. Run scripts/sweep_osm_access.py --slug white_rock_white_bm
Previous defects (resolved)¶
16 defect(s) found and fixed. Kept for the record — each names the evidence that exposed it and the test or gate that now holds it closed. Nothing here blocks anything; it is history, not state.
| Status | Defect | Script | Proof |
|---|---|---|---|
| ✅ fixed | route-label-vs-line — write_route_gpx labels a route with a distance measured ACROSS the dropout gaps that the same function then writes as |
scripts/build_recommended_route.py |
scripts/check_route_integrity.py (rito_alto_group, grizzly_jenkins_group) |
| ✅ fixed | integrity-gate-fails-legitimate-holes — The gate FAILS a report for having dropout holes in its drawn line. Breaking at dropouts is correct, approved behaviour (an honest hole beats a fabricated straight line) — the holes need MEASURING because they are what makes the label lie, but not judging. | scripts/check_route_integrity.py |
scripts/check_route_integrity.py (grizzly_jenkins_group, was a false FAIL) |
| ✅ fixed | gain-value-check-removed — There is NO value comparison for gain — only an mtime freshness check. It was removed on the reasoning that a one-directional bias meant "different quantities"; but every route rebuild this month only ever SHORTENED routes, so one-directional drift is the fingerprint of staleness, not evidence against it. | scripts/check_report_stats.py |
scripts/check_report_stats.py (27 reports) |
| ✅ fixed | osm-trail-route-holes — A route composed from swept OSM trail data inherits gaps between discontinuous OSM ways, so a pack-in leg that is supposed to follow a mapped trail has no drawn line across them. | scripts/sweep_osm_trails.py |
scripts/check_route_integrity.py (rito_alto_group) |
| ✅ fixed | composer-no-access-awareness — The route composer scores distance, gain and on-trail fraction with no concept of ACCESS — private land, ski-area boundaries, seasonal closures. It will happily propose a line that trespasses. | scripts/compose_best_route.py |
scripts/test_compose_best_route.py (test_restricted_area_disqualifies_a_candidate) |
| ✅ fixed | two-trees-diverged — The project directory the session reads (iCloud) and the git working tree (~/dev) are separate copies. Instructions and allow-list entries can differ, and the session reads the iCloud one. | CLAUDE.md, .claude/settings.json |
scripts/check_no_shadow_tree.py, scripts/test_check_no_shadow_tree.py |
| ✅ fixed | shell-cwd-resets — The Bash working directory resets between calls, so a relative scripts/foo.py runs the STALE iCloud copy against iCloud's docs — and can report success. |
n/a (harness) |
scripts/check_no_shadow_tree.py, scripts/test_check_no_shadow_tree.py |
| ✅ fixed | pre-push-hook-never-installed — The pre-push gate is not installed on this clone. .githooks/pre-push is committed and setup_hooks.sh would activate it, but core.hooksPath was never set — so git push runs no gates at all, including the format-change lock that escalates --changed to --all. |
scripts/setup_hooks.sh, .githooks/pre-push |
scripts/check_hooks_installed.py |
| ✅ fixed | rebuild-does-not-clear-stat-drift — The documented remedy for a check_report_stats row does not work. build_report.py --slug S then --finalize completes successfully and leaves the frontmatter gain_ft untouched, so the report still FAILs the gate. Nothing in the build chain writes frontmatter dist_mi/gain_ft — the only code that does lives in propagate_route.py, which is not in the chain. |
scripts/build_report.py, scripts/check_report_stats.py |
scripts/check_report_stats.py (baldy_lejos_trio, after a clean full rebuild), scripts/test_sync_route_stats.py |
| ✅ fixed | route-not-checked-against-recordings — Nothing checks that the recommended route is a PLAUSIBLE version of the day people actually walk. check_route_stats prints the recorded distance/gain range beside the route's own figures and never compares them, so a route far shorter than every recording that covers the same objectives passes. A method: graph recipe can therefore publish a fragment of a day as the recommendation, and no gate objects. |
scripts/check_route_stats.py, scripts/check_route_starts.py |
scripts/check_route_plausible.py (crestolita_broken_hand), scripts/test_check_route_plausible.py |
| ✅ fixed | auto-stops-instead-of-parking — Under --batch --on-input skip, a phase agent PARKING a report stops the whole queue. --auto prints AUTO STOPPED and exits instead of parking that slug in the batch and rolling to the next — the exact behaviour the flag's own help text promises ("skip = park that report and move to the next"). | scripts/build_report.py |
scripts/test_auto_park.py |
| ✅ fixed | presweep-holds-browser-profile — The batch flow still instructs CLAUDE to spawn the presweeper (even under --auto), and a presweeper spawned from the main session drives the MAIN SESSION's playwright MCP browser — which then sits holding the shared profile's exclusive lock after the sweep, so every subsequent headless run_agent.py spawn refuses ("profile HELD by another client, no CDP endpoint"). The orchestrator spawns sweep/research/prose agents itself via run_agent.py; the presweeper is the one agent left on the old print-instructions path. | scripts/build_report.py, .claude/agents/presweeper.md |
none (orchestration wiring; the next batch is the measurement) |
| ✅ fixed | rebuild-sweep-loses-prior-tracks — A rebuild's research phase can see almost NO source tracks for a slug whose live report has plenty: the delta manifest says the content is already held, but the files it points at were moved out by --start's quarantine (or dedup-tombstoned), so nothing re-downloads and the agent researches against an almost-empty pool. ROOT CAUSE UNCONFIRMED — the interaction of presweep timing (ran BEFORE --batch registration, against pre-quarantine disk), quarantine filename filters (old-era names vs trk_*), and duplicate_of_other_sources tombstones needs a proper trace of the quarantine dir + .sweep_state.json. | scripts/build_report.py (quarantine) + sweep delta manifest |
scripts/test_sweep_state_backing.py |
| ✅ fixed | status-page-parked-reads-as-hung — An agent-parked run renders on status.html as the generic staleness alarm ("nothing running and the state is stale — is an --advance in flight?") instead of an explicit PARKED state. The orchestrator knows the agent parked (it prints "the research agent parked"); the page it renders does not say so, so a deliberate stop reads as a hang. | scripts/build_report.py (render_status) |
none (render-path change; verified via sample --demo-status render) |
| ✅ fixed | route-quality-blocks-escalated-instead-of-solved — Route-quality findings that the pipeline should SOLVE are escalated to Kyle instead: a line crossing out-of-the-way non-objective summits, an out-and-back excursion reaching no objective, and a start that is not a mapped trailhead. Kyle, 2026-08-13: "that is never okay unless the other summits can not be avoided via the shortest path with the least elevation gain" / "fix it, its not a judgement call" / a non-trailhead start "is okay if it's an established starting point seen in various tracks". | scripts/build_report.py, scripts/compose_best_route.py, scripts/audit_route_excursions.py |
scripts/check_route_starts.py (fleet clean under the established-start rule) |
| ✅ fixed | beta-absence-asserted-not-verified — Nothing verified that the REQUIRED beta source was actually consulted. A research agent could assert "climb13ers has no page for this peak" off a failed lookup and build the report without it; the beta-fetch agent could cache 1 of 3 requested pages and report success; check_beta_provenance only verifies class_source cites SOME URL. | scripts/check_beta_completeness.py (new), scripts/ingest_beta.py |
scripts/check_beta_completeness.py, scripts/test_check_beta_completeness.py |
How route-label-vs-line was fixed
write_route_gpx now SPLITS the route into segments first, measures those segments, labels the file with that figure, and RETURNS it so no caller can print a different number than the file carries (both call sites updated). When the two differ it says so on stderr — e.g. "15 segment(s) — 1.32 mi of the source track falls in GPS dropouts and is NOT drawn; labelled 11.80 mi". rito_alto_group and grizzly_jenkins_group rebuilt; both now pass. Side effect worth noting: labels now agree with the fleet's per-segment convention, so the bridged-vs-per-segment question resolves itself — every number in the pipeline measures the line that is actually drawn.
How integrity-gate-fails-legitimate-holes was fixed
Dropout gaps are now MEASURED AND REPORTED, never failed — the gate prints them as ok* with count, total and largest, plus "(expected: the line is not drawn across a dropout)". The label-vs-line check remains a FAIL, which is the real defect. grizzly_jenkins_group's 614 ft gap is the pipeline working as designed and no longer marks the report out of compliance.
How gain-value-check-removed was fixed
Restored as a value comparison at the TIGHT ROUTE_FM_GAIN_TOL_FT (60 ft) — both numbers come from the same build, so only display rounding is allowed. 27 of 64 reports fail and are recorded on the compliance page as drift; each clears by rebuilding that report. Also removed the mtime proxy that had replaced it, which failed grizzly_jenkins_group whose route rebuilt to the IDENTICAL 7.40 mi / 4,441 ft — a rebuild that changes nothing needs no re-finalize, and a changed PNG is check_map_fresh's job. Footnote on my own reasoning: the drift is NOT strictly one-directional after all — gold_basin_trip (+64 ft) and wayah_group (+90 ft) go the other way, which is what staleness looks like and is the opposite of what I claimed when deleting the check.
How osm-trail-route-holes was fixed
The diagnosis was wrong: the OSM trail was never discontinuous. fetch_osm_trail runs Dijkstra over the OSM way graph, whose edges exist ONLY between consecutive nodes of a mapped way, so every step it emits is a real mapped connection by construction. The 1,019 ft "gaps" were SPARSE DIGITISING — a straight section mapped with two distant nodes. The real defect was that three separate places applied a GPS-recording assumption to mapped data: write_route_gpx split the continuous trail at MAX_INTRA_TRACK_GAP_M (a dropout rule), check_route_integrity counted the pieces as holes, and check_route_geometry read a 0.20 mi collinear run as a line invented over unrecorded ground. Fixed by giving the pipeline a first-class notion of provenance: is_mapped_source() detects an OSM-derived source by creator, write_route_gpx keeps such a line continuous AND stamps "
How composer-no-access-awareness was fixed
New scripts/osm_access.py is the single definition of "restricted": access=private / access=no areas, landuse=winter_sports, landuse=military. AREAS only — Overpass returns every way carrying access=private and most are ROADS (open lines), where point-in-polygon is meaningless and a gated road is find_osm_trailheads' problem; requiring a closed ring cut jacque_peak's 93 hits to 24 real areas while keeping Copper Mountain. scripts/sweep_osm_access.py writes gpx/
How two-trees-diverged was fixed
CLOSED by environment action, in the sequence set out in HANDOFF.md: (1) memories copied into the repo at handoff-memory/ — they are path-keyed and machine-local, so changing the project directory would have erased them; (2) .claude/settings.json un-gitignored so the allow-list travels; (3) Kyle pointed the Claude project directory at ~/dev/mtn_research; (4) Kyle RETIRED iCloud/Projects/mtn_research by RENAMING it to _mtn_research rather than deleting it, as a safety net. Renaming is sufficient: the old path no longer exists, so nothing can open it as a project directory, and a relative script call with a reset cwd now fails loudly with "no such file" instead of silently running stale code. It still syncs, so it carries a RETIRED-DO-NOT-USE.md tombstone that travels with it to Mac 2. mtn_research_data/ (creds) and shared/peak_db are kept. VERIFIED on the clone before closing: run_gates.py --all --status-out gates all 67 reports green (27 pre-existing gain-drift rows recorded, unchanged), which exercises peak_db on sys.path, both cts.ini symlinks and the gpx/ tree — so the machine is wired, not merely renamed. The PROOF is new, because the fix lives in the filesystem and nothing was keeping it fixed: check_no_shadow_tree.py (wired into run_gates' REPO_WIDE) FAILs if the retired path returns, if any untombstoned lookalike tree appears in iCloud, or if a clone ever lands inside iCloud. Its red state — the exact pre-2026-07-30 filesystem — is demonstrated in test_check_no_shadow_tree.py against a fake iCloud tree, since it cannot be observed on this machine again. Honest limit: the gate cannot read the harness's project-directory setting, which is what actually decided which tree got read; it ensures there is no plausible wrong tree to point at.
How shell-cwd-resets was fixed
CLOSED, though not by repairing the harness — the working directory still resets between Bash calls. What is fixed is the DAMAGE: with the iCloud shadow retired (see two-trees-diverged), a wrong cwd has no stale tree to silently operate on, so the failure mode changes from a vacuous green to a loud "no such file". That is the whole defect as recorded — the evidence was never "cwd resets", it was gen_quickstats.py --check reporting success while executing a stale copy of itself. Remaining mitigations stand: CLAUDE.md requires one bare cd to the clone as the session's first Bash call and forbids the shell wrappers that hide the cwd. check_no_shadow_tree.py is the proof, because it is the absence of a second tree that does the work here; if a shadow ever returns, this defect returns with it and the gate says so.
How pre-push-hook-never-installed was fixed
Ran scripts/setup_hooks.sh on the clone (core.hooksPath -> .githooks), after Kyle said to continue from here; check_hooks_installed.py went from RED to green on the real machine, so this entry's red state was directly observed rather than simulated. The gate is wired into run_gates' REPO_WIDE set, so a clone that skips the step now FAILs instead of pushing silently — which is the durable part, because the fix is a git config that no file carries. The root cause was documentation, not code: setup_hooks.sh existed but was referenced in no .md in the repo, so every new clone skipped it. It is now HANDOFF.md bootstrap step 4b with the reason attached, so it does not read as optional on Mac 2.
How rebuild-does-not-clear-stat-drift was fixed
New scripts/sync_route_stats.py runs FIRST in build_report's finalize_phase, reconciling frontmatter dist_mi/gain_ft (and the "~X mi / ~Y ft" headline) with the route files the build just produced — so everything downstream reads one set of numbers and the pipeline reaches a fixed point. Written test-first: test_sync_route_stats.py, 16 cases, red before the module existed. IDEMPOTENCE is asserted directly (applying twice changes nothing; a value that rounds to the same display is stable across builds) because a writer that shifted a number every run would turn each rebuild into fresh drift. Measurement is SHARED, not reimplemented — it imports check_report_stats' own measure_gpx_dist_mi and gain_from_track_name. Two implementations of one quantity is what caused the rito_alto mess (combo_stats vs check_report_stats disagreeing by 1.33 mi on the same file), so the writer and the gate cannot drift apart by construction. It REFUSES rather than guesses: on a route that fails check_route_recipe / _fidelity / _integrity (an untrustworthy route must never become a published number), on an unreadable gain, and on a days_detail arithmetic conflict. RESULT: the recorded drift went 27 → 5. Also added rebuild_reports.py --finalize-only, since this drift needs only the finalize phase; the data phase would have minted a new CalTopo map per report and changed nothing else (measured on baldy_lejos_trio, whose data-phase rebuild changed only the caltopo_id). 27 reports re-finalized in 15.5 min instead of ~65. HONEST LIMIT — the 5 that remain are REFUSALS, not failures, and all 5 are multi-day trips (cimarron_coxcomb, gold_basin_trip, gold_dust_group, south_san_juans_3day, west_willow_la_garita). In each, frontmatter days_detail disagrees with the per-day route files (gold_basin_trip: days sum to 12.10 mi / 4,803 ft vs routes at 11.94 / 4,867), so syncing only the totals would break the frontmatter's internal arithmetic, and rewriting the per-day figures to force the sum is RULE_DEVIATIONS row 10 verbatim. They need their ROUTES reviewed per-report through the full workflow, with report context loaded — which is Kyle's standing rule for route changes, not something to mechanize. They stay recorded on the compliance page until then.
How route-not-checked-against-recordings was fixed
New scripts/check_route_plausible.py, wired blocking in run_gates. It compares the recommended route's DISTANCE against the shortest recorded track that reaches EVERY objective, and fails below 55% of it. Written test-first (7 cases, red before the module existed), and red on crestolita_broken_hand: "dist 3.8 mi is 53% of the shortest full-coverage recording (7.1 mi)". DISTANCE ONLY, and that narrowing is the substance of the fix rather than a shortcut. The first version also compared gain and produced 6 failures that were ALL its own bug — lake_fork_peak read 227 ft against a published 2,409 ft, italian_mountain 872 against 3,355. The route files are fine; accumulated gain over them is not a stable quantity, and our own combo_stats reads 644 ft where this script read 227 on the same file. Published gain is DEM, recorded gain is GPS
How auto-stops-instead-of-parking was fixed
cmd_auto now consults the batch's --on-input policy the moment an agent parks, via the extracted auto_handle_park(): under skip the slug is parked IN THE BATCH (reason = the first heading of PARKED.md, so --batch-status says why), its run is aborted (live report restored byte-identically) and the queue continues; under stop the batch halts with the run left INTACT for Kyle to resume; a lone --auto run parking still stops, since there is no queue to advance. Written test-first (11 cases, red before the helper existed), including the halt-does-not-abort property.
How presweep-holds-browser-profile was fixed
cmd_auto pre-sweeps the queue ITSELF: at the top of the auto loop, an incompletely pre-swept batch spawns the presweeper headlessly via run_agent.py (own browser lifecycle — the agent's Chrome dies with the agent, so the profile is free afterwards) and records --batch-presweep-done only on agent success; the per-build sweep phase still verifies fetch-record freshness independently, so a no-op presweep is caught by the existing gate. --batch X --auto now flows straight into the auto loop, and the batch kickoff no longer prints spawn instructions for Claude — the last such instruction in the flow is gone. A presweeper failure (logged-out source) HALTS the batch rather than skipping: a session problem poisons every slug equally, so there is nothing to skip to.
How rebuild-sweep-loses-prior-tracks was fixed
New sweep_peak.disk_backed_state(): A CLAIM MUST BE DISK-BACKED. Judged per source and WHOLESALE — a source with manifest claims and ZERO matching trk_
How status-page-parked-reads-as-hung was fixed
render_status detects gpx/
How route-quality-blocks-escalated-instead-of-solved was fixed
Three changes, one per rule Kyle stated: (1) ESTABLISHED STARTS — check_route_starts no longer flags a start that 3+ independent recorded tracks share within 0.12 mi. A cluster of parties parking somewhere IS the evidence a trailhead is real, the same standard the TH research itself uses; one track still proves nothing. Fleet re-measured: 76 single-day routes, zero flagged. (2) EXCURSIONS ARE EXCISED — the route phase runs audit_route_excursions after building and, on a finding, sets opts.trim_spurs in the recipe (comment-preserving write) and rebuilds ONCE. It is recorded in the recipe, so the fix is reproducible rather than a one-off. Frozen/multi_segment recipes are left alone (the committed file IS the source). (3) NEVER ESCALATED — a stop whose blockers name check_trip_continuity / audit_route_excursions / check_route_drawn parks the report as a TOOLING item and the queue continues, in stop mode too. Kyle only ever sees route questions that are genuinely his. HONEST LIMIT: this stops the wrong questions reaching Kyle and fixes excursions at the source, but it does not yet make the COMPOSER prefer lines that avoid out-of-the-way non-objective summits — a route that crosses them still parks for a human to re-recipe. That remaining piece is filed as the enhancement composer-avoids-out-of-the-way-summits.
How beta-absence-asserted-not-verified was fixed
New check_beta_completeness gate (wired per-slug, blocking for pushed reports): a CO report's beta cache must hold a climb13ers page OR a formal verified-absent record — ingest_beta.py --absent climb13ers --evidence "..." — whose evidence names what was searched AND what URL 404'd (≥40 chars, must contain a URL; a bare "no page" refuses). Same shape as check_source_coverage for GPX. Non-CO reports exempt (climb13ers is Colorado-only). Written test-first (7 cases, red before the module existed). The held homestake report was discarded (Kyle) and restarted with the corrected beta carried in deviations.yml.