Logbook · Entry 07Terrain diagnostics4 min read

B/S does not transfer to the valley

A classic light-wind summer Sunday at Red Mountain — flyable nine to six, cloud base near 4,000 m — and the buoyancy/shear ratio condemned it three times over: 0.53, 0.60, 0.65, all deep in the zone where flatland doctrine says organized shear tears thermals apart before a glider can work them. The ratio has a long pedigree: divide the boundary layer’s convective velocity scale W* by the vector wind difference between the surface and the boundary-layer top, and low values warn of broken lift. This project computes it exactly as its predecessors plot it, so pilots can compare numbers directly — which is how the assumption hiding inside the ratio finally surfaced at a mountain site.

The trace

The reading is a production consumer’s — hrdps-continental at Red Mountain, a 1,537 m Kootenays valley site, run 2026-08-08T18Z, valid the Sunday that followed, gusts under 24 km/h:

hourW*BL top10 m windBL-top wind (interpolated)vector shearB/S
11 a.m.2.83,941 m6 km/h @ 138°18 km/h @ 229°5.3 m/s0.53
1 p.m.3.14,177 m9 km/h @ 180°19 km/h @ 249°5.1 m/s0.60
3 p.m.2.94,178 m10 km/h @ 193°17 km/h @ 258°4.4 m/s0.65

The BL-top wind column is the strip’s own input — the wind interpolated component-wise at the boundary-layer top, which is what the shear term actually subtracts, not the nearest published level’s barb — so the two wind columns reproduce the shear column. Every wind in that table is light, and the two ends cross at 65–91°: much of the “shear” is the angle between two different wind systems. By the flatland reading — where the strip’s 0–5 axis puts anything under 1 deep in the broken zone — this stellar day is condemned three times over, and so is essentially every good summer day at sites like it.

Source: run 2026-08-08T18Z, hours 18Z/20Z/22Z, read from the reference deployment’s hrdps-continental/history/red-mountain/2026-08.jsonl.gz month archive — then public, private since the engine/instance split, so the file can no longer be fetched (the sample dataset publishes the same archive shape). Shear and ratio recomputed with the package’s surfaceToBoundaryLayerShearMps and buoyancyShearRatio, the same calls the strip makes.

The assumption

The ratio’s shear term subtracts two wind vectors and calls the magnitude “shear”, which measures something dynamical only when both vectors sample the same flow. On flat ground they do: the 10 m wind is the bottom of the boundary layer’s own profile, and a large vector difference across the layer is a real gradient a thermal must climb through. In a mountain valley the model’s 10 m wind is something else — thermally driven circulation, anabatic flow that rotates with the sun and is decoupled from the flow at boundary-layer top. Subtracting a valley breeze from a ridge-top wind does not measure a gradient any parcel experiences; it measures the angle between two different wind systems, and on the best days that angle is large by construction, because the valley wind follows the heating while the flow aloft follows the synoptics. The ratio is not noisy at such sites. It is structurally pinned to 0.3–0.7 precisely when conditions are best — a doctrine answering the wrong question with full confidence.

See it for yourself: the lab below interpolates the wind through the lift band and computes the shear with the same @azohra/meteo.briefing/derive calls the strip makes.

Follow the wind through the lift band

Move through the day's hours while the package samples the same wind field at launch and usable-lift top.

An interactive vertical wind profile showing changing wind speed and direction between launch altitude and the derived usable-lift top.

At launch 1.8 m/s from 338°At usable top 6.3 m/s from 57°Vector shear 6.2 m/s
900m 2953ft 1597m 5239ft 2293m 7524ft 2990m 9810ft 3687m 12096ft 4384m 14382ft 15 launch 1050 m

Conclusion. A single surface wind cannot describe this column: wind strengthens and turns between launch and the top of the usable-lift band.

Wind components are interpolated from the package scene; vector shear is calculated by @azohra/meteo.briefing/derive.Units wind m/s and degrees from · shear m/s · height m MSL

What the package now says

Three dispositions, in the order the evidence supports them:

  1. The assumption is documented at the quantity’s home. surfaceToBoundaryLayerShearMps and buoyancyShearRatio in the derivation API now state the same-air-mass assumption, carry this trace, and point terrain-driven consumers at the height-resolved windShear field — which measures shear layer by layer within the column and never straddles the decoupling, so it survives terrain the way launch-relative heights survive elevation bias. No classed-cell treatment (“good/broken” doctrine) ships on B/S.
  2. Unbounded is not missing. Zero shear makes the ratio infinite — buoyancy fully unopposed, the best possible reading — and the strip used to render it as the same gap as “no ratio computable”, which read as missing data. An unopposed hour now draws its own classed cell (meteo-gram-bs-unopposed); the gap again means only what a gap should.
  3. The tempting repair stays unproven. Re-anchoring the shear vector’s lower end above the valley circulation (the first published level, or launch height) might restore the ratio’s meaning at mountain sites — and might not, and would quietly make the number model-dependent, since models publish different lowest levels. That variant ships nothing until it is prototyped against days pilots actually rated, the same bar every threshold in analyze had to clear.

The general lesson is the same one the stability ramp taught from a different direction: a quantity inherited from a flatland lineage carries its terrain assumptions silently, and the fix starts with saying the assumption out loud at the quantity’s one home.