Kangchenjunga

Methodology

This is an experimental forecast. “Promising” and “unfavourable” are calibrated against dated news reports of sightings and failed attempts from 2022–2026, matched to the model data. It is not a validated model, and no percentage is shown.

What is forecast

The event (recognisable-unaided-v1): at the named viewpoint, during the stated two-hour window between sunrise and four hours after, an observer with ordinary corrected vision can recognise the Kangchenjunga massif with the unaided eye. Reports keep clear, recognisable partial, faint and obscured apart. A telephoto photograph does not prove an unaided view, and seeing a neighbouring peak is not a Kangchenjunga sighting. A forecast never says the mountain is visible now; only a fresh reviewed report can.

Geometry

Distances and bearings use WGS84 Vincenty geodesics. The ray height is h(s) = h₀ + (h₁ − h₀)·s/D − s(D − s)/(2KR), evaluated with K = 1 (no refraction) and K = 7/6 (standard refraction). Terrain clearance is sampled every 60 m along the true ray on Copernicus GLO-90 (EGM2008 heights), excluding the last 500 m so the smoothed summit does not occlude itself. From Tetulia the summit lies 134.3 km away at 351.7° true, about 3.1° above the horizon, and its upper ~2,400 m clear the Darjeeling–Singalila foothills.

Cloud along the sightline

GFS cloud cover, relative humidity and geopotential height on 17 pressure levels (1000–300 hPa) are fetched at points every 10 km along the ray plus a denser first 5 km. Levels below the model surface are masked (a populated series is not proof of validity). At each point the cloud fraction is interpolated to the ray’s height within a ±300 m envelope. Points in the same model cell are merged; the risk is the cloudiest cell (deliberately conservative). Lateral offsets of ±25 km provide an uncertainty range, never an average.

Foreground clarity

Raw surface visibility, humidity and dew-point spread at the viewpoint from GFS (downscaled to the site) and ECMWF IFS, kept as values and compared like for like: same valid time, grid cells within 30 km, elevations within 300 m. Visibility is flagged when the models differ by at least a factor of two and at least 5 km; humidity at 15 points, dew-point spread at 3 °C. These flag material differences; they do not say which model is right. GFS visibility often sits at 24,140 m (15 statute miles), which is flagged as a possible product ceiling. Surface visibility describes air near the ground, not the whole 134 km sightline.

Haze

CAMS aerosol optical depth is kept by region instead of one path average: the foreground cell, lowland corridor (median and maximum) and mountain cells, plus their gradient and foreground PM2.5. Samples in one native ≈45 km cell count once. AOD is a column quantity and cannot say how much haze sits on the slanted ray, so these values are shown, not scored, until local observations show how they relate to sightings.

Model comparisons

Each comparison is agree, disagree, not comparable or unavailable. A missing second model is unavailable evidence, never agreement. Cloud is compared only for the layers the ray can pass through at that point (Open-Meteo layers: low up to 3 km, mid 3–8 km, high from 8 km, read both above sea level and above ground), so high cloud over the plains does not count against a ray that starts at eye level.

Decision

One resolver produces one stored assessment per viewpoint and morning; the headline, day strip, viewpoint cards, calendar, share text and API all show it. In order: missing required cloud profiles give “not enough data”; a terrain-blocked sightline gives “unfavourable”; if every eligible window is cloud-covered (at least 90 % in two adjacent hours, from GFS cloud at the ray’s height over a complete profile or ECMWF cloud in the layers the ray passes through over the hills and massif) or hazy (foreground AOD at least 0.5 in two adjacent hours), the morning is “unfavourable”; if some window has every hour within the calibrated limits of past sighting mornings, it is “promising”; otherwise “uncertain”. These are model calls, not observations.

Historical calibration

There is no stream of reviewed observations to validate a visibility model, so the limits come from dated public reports: 88 Bangladeshi news reports from November 2022 to October 2026, reduced to 25 strongly dated morning sightings, 15 strongly dated failed mornings (including first-person accounts) and weaker range-dated evidence, matched to the replayed model data. Promising requires GFS sightline cloud ≤ 0.2, ECMWF hills/massif cloud ≤ 0.9, ECMWF low cloud at the viewpoint ≤ 0.3, foreground AOD ≤ 0.30 and PM2.5 ≤ 80 µg/m³ in every hour of a window. On that set it marks 19 of 25 dated sightings and none of the 15 dated failures (24 October 2026 included); held out one season at a time, the haze limit came out the same in four of five seasons. The margin is thin: at AOD 0.32 the first dated failure turns green. No dated sighting had foreground AOD above 0.40, so heavy haze (≥ 0.5) all morning is unfavourable. The evidence and metrics are in config/calibration/historical-reports-v1.json. News reports favour successful days and peak season, so this is a calibrated rule of thumb, not a validated or probabilistic model.

Morning windows

A window is two hours, [start, start + 2 h], using the hourly outputs at both ends and the middle. Every window must lie inside sunrise to sunrise + 4 h at the viewpoint. The window with the least relevant cloud is shown; all eligible windows and the selection rule are stored with the assessment. No morning probability is formed from hourly values: adjacent hours share weather and are not independent.

Legacy index

The earlier baseline-v0.1 index, 100 × min(1 − cloud, 1 − fog, 1 − haze) with an AOD ramp from 0.15 to 0.60, is still computed for comparison and replay. It is not shown, it is not confidence and it is not a probability. On 24 October 2026 it gave about 91 while foreground AOD was 0.40 (diluted to 0.19 by averaging with cleaner mountain columns) and GFS and ECMWF visibility were 24 km and 10 km. The reported attempt that morning failed.

History

Past mornings are recomputed from the Open-Meteo Historical Forecast archive (stitched short-lead forecasts). That is a model replay: not an observation, and not the forecast that was available beforehand, so no accuracy is claimed from it. Replays made before diagnostic-v0.2 have no recorded model comparisons and say so. Forecasts this site actually issued are archived separately for honest evaluation.

Validation

Precision cannot be measured without observations of ordinary mornings, so no percentage is shown. Reviewed visitor reports, including failed attempts, are archived against the forecasts issued beforehand; if they accumulate, the evaluation job scores the rule per lead time and can replace the historical calibration.

The illustration

The 3D view renders the real Copernicus DEM with Earth curvature and refraction, a single-scattering sky, terrain and Earth shadows, ground fog from model visibility, and clouds at the heights and distances GFS gives along the sightline. Haze opacity follows the baseline haze ramp. It illustrates the model’s assumptions; it is not a photograph, a live view or evidence that the forecast is right.

Data quality

Spotted a data quality issue? Email [email protected].

Active configuration

{
  "diagnostic": {
    "engine_version": "diagnostic-v0.2",
    "resolver_version": "resolver-v0.3.0",
    "target_definition_version": "recognisable-unaided-v1",
    "target": "kangchenjunga_massif_unaided_recognisable",
    "public_legacy_index_enabled": false,
    "public_probability_enabled": false,
    "public_promising_enabled": true,
    "archive_all_assessments": true,
    "timezone": "Asia/Dhaka",
    "morning": {
      "start": "sunrise",
      "end_offset_minutes_after_sunrise": 240,
      "window_minutes": 120,
      "require_window_containment": true,
      "selection_rule": "favourable_then_least_cloud-v2"
    },
    "comparison_warnings": {
      "visibility": {
        "minimum_ratio": 2,
        "minimum_absolute_difference_m": 5000
      },
      "relative_humidity_difference_percentage_points": 15,
      "dew_point_spread_difference_c": 3,
      "relevant_cloud_fraction_difference": 0.4
    },
    "comparability": {
      "max_grid_separation_km": 30,
      "max_elevation_difference_m": 300
    },
    "_cloud_layers_note": "Open-Meteo layer definitions (low up to 3 km, mid 3-8 km, high from 8 km). Whether these are above sea level or above ground is not stated, so a layer counts as relevant if the ray falls inside it under either reading, widened by cloud_vertical_envelope_m. Used only to decide comparability, never as a sighting threshold.",
    "cloud_layers_m": {
      "low": [
        0,
        3000
      ],
      "mid": [
        3000,
        8000
      ],
      "high": [
        8000,
        20000
      ]
    },
    "possible_limit_visibility_m": [
      24140
    ],
    "possible_limit_tolerance_m": 50,
    "aerosol_regions": {
      "version": "regions-v1",
      "_note": "Foreground: the CAMS cell nearest the observer. Lowland: other corridor samples over DEM terrain below lowland_max_terrain_m. Mountain: the rest. Features, not thresholds.",
      "lowland_max_terrain_m": 500
    },
    "experimental_obstruction_warning": {
      "enabled": true,
      "_sources_note": "Either source can raise the warning. gfs_ray_profile: GFS pressure-level cloud at the ray height over a complete profile. ecmwf_relevant_layers: ECMWF IFS cloud in the layers the ray passes through, at the cross-check points over the hills and near the massif; GFS profile cloud alone showed a clear ray on ~40% of monsoon mornings while ECMWF layers there were overcast.",
      "sources": [
        "gfs_ray_profile",
        "ecmwf_relevant_layers"
      ],
      "_ecmwf_points_note": "ECMWF points beyond the observer only: ECMWF low cloud/fog at the observer flagged reported sighting mornings and caught no extra failures.",
      "minimum_relevant_cloud_fraction": 0.9,
      "minimum_adjacent_hourly_outputs": 2,
      "require_complete_relevant_profiles": true,
      "max_unknown_fraction": 0
    },
    "haze_warning": {
      "enabled": true,
      "_note": "Heavy foreground haze in every window makes the morning unfavourable. No dated sighting in the 2022-2026 reports had foreground AOD above 0.40; 15 of 26 reported failures had at least 0.5. See historical_calibration.",
      "minimum_foreground_aod": 0.5,
      "minimum_adjacent_hourly_outputs": 2
    },
    "historical_calibration": {
      "enabled": true,
      "artifact_id": "historical-reports-v1",
      "evidence": "config/calibration/historical-reports-v1.json",
      "_note": "Promising when every hour of a window meets all limits. Fitted to dated public reports of sightings and failed attempts (Nov 2022 - Oct 2026) against the stitched replays; round numbers chosen at the edge where no strongly dated failure turns green. Not a validated model and not a probability.",
      "promising": {
        "max_gfs_ray_cloud": 0.2,
        "max_ecmwf_hills_cloud": 0.9,
        "max_ecmwf_observer_low_cloud": 0.3,
        "max_foreground_aod": 0.3,
        "max_foreground_pm2_5": 80
      }
    },
    "required_data": {
      "max_cloud_unknown_fraction": 0.25
    },
    "legacy_engine": {
      "version": "baseline-v0.1",
      "retain_for_replay": true,
      "public_decision_authority": false
    },
    "validated_model": {
      "artifact_id": null,
      "required_for_promising": true,
      "thresholds_source": "validated_artifact_only"
    }
  },
  "legacy_engine": {
    "engine_version": "baseline-v0.1",
    "timezone": "Asia/Dhaka",
    "forecast_horizon_hours": 72,
    "trend_horizon_days": 15,
    "publish_probabilities": false,
    "primary_profile_model": "gfs",
    "secondary_profile_model": "ecmwf_ifs025",
    "secondary_profile_enabled": false,
    "surface_crosscheck_model": "ecmwf_ifs",
    "aerosol_domain": "cams_global",
    "profile_hpa": [
      1000,
      975,
      950,
      925,
      900,
      850,
      800,
      750,
      700,
      650,
      600,
      550,
      500,
      450,
      400,
      350,
      300
    ],
    "weather_path_spacing_m": 10000,
    "weather_path_near_m": [
      0,
      2500,
      5000
    ],
    "lateral_offsets_m": [
      -25000,
      25000
    ],
    "lateral_at_m": [
      30000,
      60000,
      90000,
      120000
    ],
    "terrain_path_spacing_m": 60,
    "terrain_endpoint_exclusion_m": 500,
    "cloud_vertical_envelope_m": 300,
    "cloud_sensitivity_envelope_m": 600,
    "cloud_aggregation": "maximum_unique_cell",
    "cloud_obstruction_threshold": 0.8,
    "max_extrapolation_m": 300,
    "refraction_k_scenarios": [
      1,
      1.1666666667
    ],
    "aod_ramp": [
      0.15,
      0.6
    ],
    "fog_visibility_ramp_m": [
      5000,
      1000
    ],
    "fog_support": {
      "relative_humidity_min_pct": 95,
      "dew_point_spread_max_c": 1,
      "wind_max_ms": 2,
      "risk_floor": 0.6
    },
    "disagreement": {
      "fog_risk_delta": 0.5,
      "precip_mm": 0.5,
      "low_cloud_delta_pct": 60
    },
    "local_rain_mm": 0.3,
    "bands": {
      "poor_below": 35,
      "promising_at_least": 70
    },
    "morning_hours_after_sunrise": 4,
    "recent_sighting_ttl_minutes": 30,
    "require_aerosol_for_promising": true,
    "require_verified_geometry_for_promising": true,
    "_geometry_note": "require_verified_geometry_for_promising means the DEM sightline clearance is clear under every refraction scenario. Viewpoint pin verification is reported separately and does not gate the conditions band.",
    "freshness": {
      "weather_check_minutes": 30,
      "cams_check_minutes": 180,
      "delayed_after_hours": 3,
      "withhold_promising_after_hours": 9
    }
  }
}