Somerset Weather · Hyper-local Forecast

Frost Advisoryuntil 9 AM Monday
Frost Advisory issued October 18 at 1:04PM EDT until October 19 at 9:00AM EDT by NWS Northern Indiana
Details from the National Weather Service
* WHAT...Temperatures as low as 35 will result in frost formation.

* WHERE...Portions of northern Indiana and northwest Ohio.

* WHEN...From 1 AM EDT /midnight CDT/ to 9 AM EDT /8 AM CDT/ Monday.

* IMPACTS...Frost could harm sensitive outdoor vegetation. Sensitive
outdoor plants may be killed if left uncovered.

Take steps now to protect tender plants from the cold.

Claude's lab notebook

A working notebook for trying to improve the Somerset forecast. Ideas, plans, raw results and conclusions live here, including the ones that don't work. Nothing moves into the real forecast until it has passed a test it couldn't have known the answer to, and Brian has agreed.

How I work here
  1. Write down the plan and the passing mark before running the test.
  2. Grade only on days set aside: the model is built from earlier months and graded on later ones it was never built from (with an 8-day gap between them, so nothing leaks across).
  3. Compare against the forecast as it is today, on exactly the same days, and publish the result either way.
  4. Keep failures. A clean 'no' is a result.
  5. Promote nothing into the forecast without a solid result and Brian's OK.
24experiments3promoted to the forecast 8ideas waiting10research threads last updated October 18, 2026

Research

Long-running investigations, from the ground to the upper air. Each thread grows over many sessions and produces ideas; only a formal experiment below can change the forecast.

PROGRAMResearch program activeupdated October 16, 2026

Brian's charge (October 16, 2026): do novel research on every part of the forecast, from the ground to the upper atmosphere. Chase any connection that looks real. Research can run across many sessions and wait for data to build up. The goal is a more accurate model, and where possible a narrower +/- range, even if only for the nearest days.

This folder is where that research lives. Each thread is one text file that grows over time: what we know, what the literature says, what was explored, what is waiting for data, and what to try next. The Lab Notebook entries (L-00N) are the formal tests. A thread produces ideas; only a pre-registered test can turn an idea into a change.

How research becomes a forecast change

  1. Explore on the discovery years (walk-forward residuals for March 2024 to September 2025). Look freely. Nothing found here counts as evidence by itself, because looking at many ideas on the same days will always turn up some that work by luck.
  2. Pre-register the most promising idea as a Lab Notebook entry: question, plan and pass/fail bar written and published before the test.
  3. Test walk-forward on the test year (October 2025 onward), against today's model on identical days.
  4. Confirm on months nobody has looked at (from October 2026 on). The test year has now been used by many experiments, so a pass there is necessary but not enough for promotion.
  5. Promote only after Brian and Claude agree in a session.

The honest ceiling

Our day-1 errors are already small: about 1.6 F for lows and 1.8 F for highs on average (discovery years). Typical national guidance runs 2.5 to 3 F. What is left is partly weather nobody can see coming a day ahead, and partly the station's own noise. Gains from here will be tenths of a degree, hard won. Narrower ranges are more within reach than big accuracy jumps, because a range can shrink on the days we can tell are easy.

Data on hand (Tower: /lab/data, Mac: hyperlocal/data/research)

FileWhatPeriodUse it for
runs_gfs/ecmwf/icon/gem.parquetReal model runs (00Z, 12Z), 7 days, every level from 1000 to 300 mb plus CAPE, lifted index, freezing level, water vapour2026-04-02 on, grows dailyHonest tests at true lead times
upper_hist_*.parquetThe models' first hours stitched together, same variables2023 onLearning relationships only ("perfect prog"). NEVER score a forecast with it: it is far better than anything known at issue time
era5.parquetERA5 reanalysis at the station: soil moisture at 3 depths, soil temperature, boundary layer height, water vapour, evapotranspiration, vapour pressure deficit2023 to about 6 days agoLand surface and boundary layer research
asos.parquetHourly airport observations: Marion, Kokomo, Grissom, Muncie, Huntington, Fort Wayne, Logansport, Anderson (temperature, dew point, wind, gusts, pressure, cloud layers and heights, visibility, weather)2023 onNeighbours, upstream clouds, siting checks
WorkingDrive "4. Archives/Meteorology" (NOAAMO*, NOAAYR*)Weather Display's NOAA monthly and yearly climate reports: the station's daily high, low and rainFeb 2018 to Jun 2020Grading WxSim's 2018-2020 forecasts (archive: WorkingDrive "4. Archives/WxSim/wxsim/f*.txt", 5,651 runs 2018 to March 2023)
/trainer/data/*Station truth, 1-minute station history, model forecasts by lead (surface), sunshine, CAPE, wind direction, pressure2023 onEverything
/hl/hyperlocal.dbLive collector: observations, model snapshots, the 122-run ensembles (saved since mid-October 2026), NWS discussions and alertsliveRecent and live studies

python /lab/research_data.py runs adds the newest model runs (the morning watcher does this daily); era5, asos and upper top up the others.

Threads

ThreadQuestionStatus
R-001Can we tell easy days from hard days, so the +/- is narrow when it can be?exploring: small lead found
R-002Night cooling: what controls how cold it gets, and what do we miss?exploring: busts follow calm (decoupling) nights the models can't see
R-003The atmosphere above: mixing, inversions and the upper air for highs and lowsL-004 not passed: right direction, too small in summer; winter check scheduled
R-004The land: soil moisture, crops, leaf-out and leaf-off, snowexploring: dry soil lines up with highs running too warm (unexpected sign)
R-005Rain: moisture depth, lift, storm type, timing, and the gauge itselfnot started
R-006Neighbours and upstream: what nearby stations see before we doexploring: upstream low cloud is weak
R-007Frost and freeze: are the chances honest near the threshold?exploring: slight warm bias near freezing
R-008Hour by hour: our own station-corrected forecast for every hour of the next two daysL-003 not passed (9.6% vs 10%, better every month); L-005 confirms on fresh months
R-009WxSim: how good has it been, and could it help our forecast?WxSim adds about 0.01-0.02 F on discovery years; L-006 tests it on fresh months
R-010Our own physics: a night-cooling model built for this stationdesigning version 1

Library (literature behind the threads)

Questions for the library

The unattended lab has no web browsing (a safety choice: see the brief). When a session needs literature, it adds a question here and Claude looks it up in the next session with Brian.

  • (none yet)
R-001Easy days and hard days: a +/- that knows how confident to be exploringupdated October 18, 2026

The question

Every forecast carries an 80% range (the +/-). Today it widens only when the four models disagree (expected miss = a + b x model spread). Can we tell easy days from hard days better than that, so the range is narrow when the weather is predictable and honestly wide when it is not? Brian asked for a smaller +/-; this is the most direct route.

Why it might work (physics and literature)

  • The spread of an ensemble carries information about the size of the error (the spread-skill relationship). EMOS (Gneiting et al. 2005) builds the forecast spread from a constant plus the ensemble variance and gives better calibrated ranges than a fixed width. We use 4 models; the 122-run ensembles we now save are a richer signal.
  • Some weather is simply easier: a sunny afternoon with a steady wind mixes the air predictably; an overcast day whose clouds may or may not break, a front arriving mid-day, or a snow-covered night are hard.
  • Our discovery data already shows it for highs (below).

What has been explored

2026-10-18, cold and warm spells (from Brian's review of a long-running physics forecaster's history). That program found its forecasts erred differently in unusually cold or warm spells, and warned that measuring it against what HAPPENED instead of what was FORECAST manufactures a false pattern. Checked on our forecast, discovery years, out-of-sample predictions, leads 1 to 7, with 1991-2020 normals for daily highs and lows (ERA5 at the station, shifted to the station by month; research/normals.py, research/spells.py).

Error (observed - forecast) per degree the FORECAST is from normalDay 1Day 3Day 5Day 7
Lows+0.02+0.00+0.01+0.08
Highs+0.01+0.00+0.01-0.03
Lows, measured against what happened instead (the false pattern)+0.07+0.10+0.18+0.36

No spell bias: our forecast is neither too timid nor too bold in big cold or warm spells, at any lead, and a cross-validated correction made every lead slightly worse (0.02 to 0.06 F). Spells are HARDER (day-1 lows 2.0 F off when forecast 12+ F below normal, 1.4 F near normal) but not biased. The false pattern is real and grows with lead: calibrating on observed departures would have pushed our day-7 forecasts a third of a degree further from normal per degree, the wrong way. Every correction we test is built on what is known at issue time, which avoids it. One thing to watch: day-1 lows forecast 12+ F below normal ran 0.7 F too warm (36 nights, within noise). The deep cold this winter will tell.

2026-10-16, discovery days (Mar 2024 to Sep 2025), leave-one-month-out. Expected miss from model spread alone vs. spread plus weather regime (clear-and-calm index, model cloud and wind, season, recent error size, snow on the ground, cold nights). Both scaled so 80% of misses fall inside.

today's rule: avg +/-regime: avg +/-regime: narrowest 10% of daysCRPS change
Highs, day 12.82.91.8-0.7%
Highs, day 23.73.52.2-0.3%
Lows, day 12.72.72.2+0.2%
Lows, day 23.43.32.8+0.3%
Highs, day 77.77.74.8-0.4%

(CRPS: the standard score for a whole forecast distribution, lower is better.)

What it means so far: the regime version spreads the ranges out (easy days get much narrower ranges, hard days wider) while keeping 80% coverage, but the overall score barely moves. Sunny light-wind days have smaller misses in the highs (1.7 F vs 2.4 F on day 1-2). Snow on the ground makes lows harder (2.4 F vs 1.9 F, 40 nights). A lead, not a finding.

Scripts: hyperlocal/research/r001_explore.py, results r001_explore.json.

2026-10-18, the miss review look-back (Brian asked what we do with big misses, after the October 18 high came in 68.4 F against 63.3 F). Our day-1 high and low as forecast walk-forward (each day from data before it), with the conditions of each day: the models' forecast (disagreement, cloud, sunshine, dryness) and what happened (pyranometer sunshine, wind, dew point swing, rain). Patterns looked for on March 2024 to July 15, 2026 only; July 16 to October 12, 2026 held back to check them. Script: hyperlocal/research/miss_lookback.py (output miss_lookback.out).

DaysTypical missOutside the 80% range (should be 20%)5 F+ misses
Highs, exploration8341.71 F24%31 (3.7%)
Highs, held back791.74 F28%3
Lows, exploration8381.68 F21%20 (2.4%)
Lows, held back781.47 F19%1
Highs: share outside the 80% rangeExplorationHeld back
Forecast cloud 80%+30% (207 days)40% (15)
0.1 in of rain or more in the window34% (89)55% (11)
All other days21% (596)22% (59)

What it shows:

  • The +/- for the high is honest on ordinary days and too narrow on cloudy and wet days. That is idea 3 below, answered for highs: the range is right on average but wrong on the days that matter most. Lows are close to 80% in every group checked.
  • Big misses are mostly misses the four models made too: on 23 of the 31 highs off by 5 F or more, the models' average was off by 4 F or more as well. Our correction cannot fix what every model gets wrong. 42% of the big misses came on days whose sunshine differed from the forecast by 15% of clear sky or more (21% of all days): cloud timing again (R-010).
  • Days like October 18 (September to November, 80%+ sunshine, dry air): 76 days, typical miss 1.36 F, came in 0.41 F warmer than forecast on average, 18% outside the range. No sign of a systematic problem; October 18 was a rare day (the held-back 12 such days: +0.76 F, 33% outside, too few to say more).
  • Lows ran 0.9 F too cold on nights the dew point held steady (306 nights; held back +1.27 F, 14 nights) and 0.9 F too warm when it swung 12 F or more (an air-mass change; held back -0.58 F). The swing is measured after the fact, so it cannot be used as it is; the question is whether the models' FORECAST of the swing carries the same signal.

Ideas to chase

0b. Lows: does the models' forecast overnight dew point change predict the warm/cold lean above? Explore on

  1. Wider ranges for the high on days forecast cloudy (80%+) or wet (rain chance high): fit the extra width on the exploration days, test coverage on fresh days (the held-back months are too few cloudy days to judge). discovery days first (R-002).
  1. The 122-run ensemble spread as the confidence signal (needs about 6 months saved: spring 2027).
  2. Upper-air stability and mixing as a confidence signal for highs: strong inversions and shallow mixing make highs hard (R-003 data).
  3. Check that the narrower ranges are honest within each regime (80% coverage on sunny days and on cloudy days separately), not just overall. A range that is right on average but wrong on the days it shrinks is worse.
  4. Different shapes: our misses may not be bell-shaped near freezing or on snow nights (see R-007).

Next step

When the run archive covers a winter, pre-register: "regime-aware ranges, highs days 1-2: mean +/- at least 5% narrower at 80% +/- 2% coverage on the test year, and coverage within 75-85% in each regime tercile." Then confirm on fresh months.

Log

  • 2026-10-16: thread opened by Claude with Brian. First exploration above.
  • 2026-10-18: cold and warm spells checked: no spell bias at any lead; the observed-departure false pattern confirmed.
  • 2026-10-18: miss review look-back: highs' range too narrow on cloudy and wet days; big misses are shared with the models; the live miss review (hyperlocal/misses.py) now records every finished period's conditions.
R-002Night cooling: what decides how cold it gets exploringupdated October 17, 2026

The question

On a clear calm night the ground radiates heat to space and the air near it cools fast; wind stirs warmer air down; clouds send heat back; moisture puts a floor under the temperature because dew and frost release heat as they form. Our lows are already good (1.6 F average miss on day 1), but about 7% of nights miss by 7-9 F even when every model agreed. What are we missing, and can anything we can measure warn us?

Literature

  • Radiation-night minimum from the temperature and dew point about two hours after sunset (UC Davis), valid only on clear nights with wind under about 5 mph.
  • NWS TM 102: the dew point acts as a floor because condensation offsets radiative cooling; clouds or wind of any duration usually keep minima well above the radiative value.
  • NWS TM 106: raise a MOS minimum when it is 5 F or more below the afternoon dew point (fog and dew limit cooling).
  • The boundary layer can "decouple" on calm nights (wind under about 1 m/s near the ground): the surface layer cools on its own. Models handle this poorly and the sign of their error varies by model and surface scheme.

What has been explored

2026-10-16, discovery nights (Mar 2024 to Sep 2025, 560 nights, day-1 forecast). At 8-9 PM: temperature vs our low, dew point vs our low (the condensation floor), dew point depression, wind, the 2-hour cooling rate, pressure change. Leave-one-month-out correction of our low:

CorrectionMAE (F)
Our day-ahead low1.618
+ how the evening temperature is running (like today's live rule)1.634
+ dew point floor1.628
+ floor, wind, cooling rate, pressure1.624
+ calm-night physics interactions1.618

Nothing helps. The strongest single signal is the evening cooling rate (correlation 0.14 with the miss) and the dew point floor (0.11), both tiny. The models (through our corrections, which already include a clear-and-calm index and the dew point depression) already know the evening state. What causes the big misses happens later in the night (the next entry looks at what).

Scripts: hyperlocal/research/r002_explore.py, results r002_explore.json.

2026-10-16, bust night anatomy (same 560 discovery nights, station minute data). Nights grouped by our miss:

Night endedNightsModels' wind (mph)Station's wind overnight (mph)Share of calm minutesDew point change overnight (F)
4 F or more colder than forecast178.43.849%0.0
2-4 F colder727.23.050%-2.8
within 2 F3877.53.339%-2.2
2-4 F warmer757.83.925%-1.0
4 F or more warmer147.64.423%+0.7

The clearest signal so far: how much of the night goes calm. Nights that ended colder than forecast were calm half the time; nights that ended warmer were calm a quarter of the time (correlation with the miss -0.22, the strongest of anything tried). Within these groups the models' wind barely differs (7.2 to 8.4 mph), so the extra calm on bust nights is beyond what the wind forecast shows (across all nights the models' wind does track calm nights well; see R-003). This is boundary layer decoupling, as the literature describes. Air masses arriving overnight (temperature rising 3 F or more after 10 PM, or the dew point dropping 5 F or more) explain only 2 of 14 warm busts and 2 of 17 cold busts. Cloud surprises explain little (see R-006).

Script: hyperlocal/research/r002_bust_anatomy.py, results r002_bust_anatomy.json.

Ideas to chase

  1. Predict decoupling (top priority, with R-003). What could tell us in advance that a night will go calm at the ground? Candidates: the forecast wind at 925 mb (about 2,500 ft; a weak flow aloft lets the surface decouple, a low-level jet keeps it stirred), the strength of the evening inversion (925 mb minus 2 m temperature), the pressure gradient. Explore on upper_hist (perfect prog), then test on the real runs. A decoupling chance could also feed R-001: calm-prone nights deserve a wider range on the cold side.
  2. Soil and ground heat. Wet, warm soil in autumn releases heat at night (R-004 data: ERA5 soil temperature and moisture). Does it explain warm misses in fall?
  3. Done 2026-10-16: evening snapshot (null), upstream clouds (weak, R-006), bust anatomy (decoupling).
  4. Decoupling, measured (new 2026-10-17). The ground sensor (R-007, "Ground sensor data") gives the grass-minus-air gap and the soil heat profile every 5 minutes. Ideas: (a) an evening nowcast: does the gap at, say, 9 PM tell how far below our forecast the night's low will land? (b) does the 8-inch minus 2-inch soil difference (heat flowing up) explain warm misses on autumn nights (idea 2, now with our own soil instead of ERA5)? Exploration on the nights as they come; any correction is tested only on months after it is written down.

Log

  • 2026-10-16: thread opened by Claude with Brian (from the backlog idea "evening frost nowcast"). Null result above closes the simple version of that idea.
  • 2026-10-16: bust anatomy: decoupling (calm share) is the leading mechanism. Next: predict it from the air above.
  • 2026-10-16: R-003 perfect prog: the inversion strength lines up with the miss (strong inversion = colder than forecast), matching the known too-much-mixing bias of models on stable nights. Formal test planned in R-003.
  • 2026-10-17: our ground sensor went in (R-007). It measures decoupling directly; idea 4 added.
R-003The air above: mixing, inversions and the upper atmosphere L-004 not passed (right direction, too small in spring and summer); winter check scheduledupdated October 16, 2026

The question

Everything our model uses today is at the surface (2 m temperature, dew point, cloud, wind, sunshine, CAPE, pressure). The weather at the ground is decided partly aloft: how deep the afternoon mixing goes, how warm the air is at 850 mb (about 5,000 ft), whether a temperature inversion traps cold air, how moist the column is. Does the upper air explain misses that the surface fields cannot?

Physics and literature

  • Mix-down for highs: on a sunny day the boundary layer mixes, and the high approaches the 850 mb temperature brought down dry-adiabatically (about +13 C from 850 mb to the surface). It fails with cloud, rain, fronts or strong temperature advection, and in winter inversions (Haby hints 296; OU METR 2413).
  • Inversions and snow: in winter, a shallow cold layer under warm air aloft keeps highs below model values, especially with snow cover or low cloud.
  • Wind aloft at night: a strong 925 mb wind (low-level jet) keeps nights stirred and warm; a weak one lets the surface decouple (R-002).
  • Freezing level and the column's moisture matter for rain type and amount (R-005).
  • Models mix stable night air too much, on purpose. Operational models (ECMWF documented it) keep extra turbulent mixing in stable conditions because it helps the large-scale forecast, though it degrades near-surface temperatures on stable nights (Sandu, Beljaars, Bechtold, Mauritsen and Balsamo 2013, JAMES 5:117-133: https://www.ecmwf.int/sites/default/files/elibrary/2012/12086-why-it-so-difficult-represent-stably-stratified-conditions-nwp-models.pdf). Prediction: under strong inversions the models' nights run too warm.

Data

  • upper_hist_<model>.parquet: 2023 on, stitched first hours of each run (close to an analysis). Learning only.
  • runs_<model>.parquet: real runs from April 2, 2026 at true lead times. The only fair data for testing a forecast input. Grows by two runs a day per model.
  • Observed soundings (ILN Wilmington OH, ILX Lincoln IL, DTX White Lake MI) are available from the IGRA archive if needed to check the models aloft.

What has been explored

2026-10-16, decoupling and inversions, PERFECT PROG (GFS near-analysis aloft, 565 discovery nights, day-1 lows). An upper bound only: these values are known in hindsight.

What predicts a calm night at the station (correlation with the share of calm minutes, 11 PM to 7 AM): the models' 10 m night wind -0.75, our clear-and-calm index 0.79, the 925 mb wind -0.67, the inversion 0.44. So the models do know which nights will be calm in general; the 925 mb wind adds little to that.

But the inversion strength (925 mb temperature minus 2 m temperature, overnight) lines up with our miss, steadily:

Inversion overnightNightsShare calmOur miss (obs - forecast)
none (warmer at the ground)23922%+0.45 F
0-3 F13944%-0.05 F
3-6 F10050%-0.23 F
6-10 F6358%-0.58 F
over 10 F2470%-0.85 F

Under strong inversions the night ends colder than we forecast; with none it ends warmer. Exactly what the too-much-mixing bias predicts. Leave-one-month-out correction of our low: 1.618 -> 1.601 F with 925 mb wind and inversion, 1.587 F adding wind x clear sky and the evening inversion (2% better, an upper bound).

Caution: the inversion here uses the near-analysis's own 2 m temperature, which may partly stand in for knowing the night's outcome. Only the real runs (forecast inversion at true lead times) can say whether this survives.

Script: hyperlocal/research/r003_decoupling_pp.py, results r003_decoupling_pp.json.

2026-10-17, L-004 on the real runs (pre-registered). 177 nights, April to September 2026, ECMWF and ICON 00Z runs. Lows days 1-2: 1.541 -> 1.528 F (0.013 better; bar 0.02), positive in 74% of resamples (bar 90%). Strong forecast inversions (3 F or more, 72 forecasts): correction -0.42 F on average, error 1.181 -> 1.170 F (physics check passed). Day 1 +0.031 better, day 2 0.005 worse. Not passed. Winter confirmation (October 2026 to March 2027) still scheduled with the frozen correction; a pass there would justify a new pre-registered version, not promotion.

Next step (as pre-registered, now run: see L-004 in the notebook)

Formal test, written into the notebook before any run-period data is examined: forecast inversion strength (925 mb minus 2 m, 11 PM to 5 AM) and 925 mb wind from the real runs, the run issued closest to our issue time for each lead, as a correction to our day 1-2 lows. Perfect-prog design: learn the correction on upper_hist (2023 to September 2025), then apply it unchanged to the real runs' forecast values (the runs start too late to train on). Test months April to September 2026 (test-year months never used with these inputs), confirm on October 2026 to March 2027 (winter, when inversions are strongest). Draft bar: lows days 1-2 MAE at least 0.02 F better on both periods, and the gain coming from the strong-inversion nights (physics, not luck).

Ideas to chase

  1. Mix-down potential for highs: 850 and 925 mb temperatures brought down dry-adiabatically, compared with our forecast high, on sunny days. Does the gap predict our miss?
  2. Inversion strength (925 mb minus 2 m temperature; 850 minus 925) as a confidence signal (R-001) and as a correction in winter.
  3. Low-level jet at night: 925 mb wind speed after midnight vs our low's miss.
  4. Thickness and air mass: 1000-500 mb thickness (from geopotential heights) as an air-mass signal when the surface models disagree.
  5. Perfect-prog route: learn relationships on upper_hist (2023 on), then apply them to the real runs and test on the run period only.
  6. Aircraft profiles (Brian's question 2026-10-16). Airliners report temperature and wind (some also humidity) on every climb and descent; Indianapolis (FedEx hub, busy overnight) gives many evening and night profiles. They observe the low-level inversion directly, hours before the night plays out. Access: NOAA MADIS keeps aircraft data since 2001; most is public after 48 hours, real time only for the humidity-sensor aircraft (mainly UPS and Southwest) or with an approved MADIS application (https://amdar.noaa.gov, https://madis-data.cprk.ncep.noaa.gov/wmo_gdc.shtml). Research test with the delayed data: does the evening inversion measured by aircraft at IND explain our lows' miss better than the models' inversion? If clearly yes, that justifies applying for real-time access.

Log

  • 2026-10-16: thread opened. Backfill of upper-air history (4 models, 2023 on) and real runs (April 2026 on) started.
  • 2026-10-16: perfect-prog inversion signal found (above). Next: pre-register the real-run test.
  • 2026-10-17: L-004 pre-registered and run: right direction, too small in spring and summer. Not passed.
R-004The land: soil, crops, leaves and snow exploring: puzzling first resultupdated October 17, 2026

The question

The station sits in north-central Indiana farm country. The ground changes through the year: bare fields in spring, corn and soybeans pumping water into the air in July, harvest in October, leaves on and off, snow cover. Wet soil spends the sun's energy evaporating water (cooler highs, higher dew points); dry soil heats the air (hotter highs, bigger day-night swings). Do our forecast misses follow the state of the land?

Physics and literature

  • Mueller et al. (2016): cropland intensification across the Midwest cooled the hottest summer days through evapotranspiration; no cooling during droughts, because transpiration needs soil water.
  • Soil moisture errors in models shift 2 m temperature forecasts by up to about 2 C (Geophysical Research Letters 2024), with the biggest effects when soils are dry.
  • "Corn sweat": peak-season corn raises dew points in July, a known Corn Belt effect on heat index forecasts.

Data

  • era5.parquet: soil moisture at 0-7, 7-28 and 28-100 cm; soil temperature; evapotranspiration; vapour pressure deficit. Known with about a 6-day delay, so a live version would use the station's own rain history or a model's soil analysis instead.
  • The station's rain history (minutes.parquet) gives antecedent rain for free, live.
  • USDA weekly crop progress for Indiana (planting, silking, harvest dates) would date the crop calendar each year.

What has been explored

2026-10-16, soil moisture vs. our day-1 highs (561 discovery days). ERA5 soil moisture anomaly (vs. the same time of year) at 7 AM; the station's rain over the previous 7 and 14 days.

Correlation of our miss (observed minus forecast) with the soil moisture anomaly, sunny days in brackets: spring +0.13 [+0.24], summer +0.15 [+0.14], fall +0.17 [+0.27 at 0-7 cm, +0.37 at 7-28 cm], winter -0.11 [-0.15].

Spring and summer highs by soil moisture (7-28 cm): driest fifth of days -0.89 F (we ran too warm), dry -0.16, normal -0.57, wet -0.18, wettest fifth -0.11.

The sign is the opposite of the textbook. Dry soil should make the real high hotter than a model expects; here, on dry-soil days, the day came in cooler than our forecast. Possible readings: (1) the models already over-react to dry topsoil (their soil schemes dry the surface fast, while deep-rooted corn and soybeans keep transpiring from water a metre down); (2) a confound: the dry spells of 2024 and 2025 fell in particular weather patterns. As a correction it is worthless: leave-one-month-out MAE 1.805 -> 1.805 (soil), 1.817 (station rain, worse).

Script: hyperlocal/research/r004_soil_explore.py, results r004_soil_explore.json.

Ideas to chase

  1. Untangle the dry-soil sign: does the models' own forecast high on dry days run hotter than ours (i.e. are the models over-reacting and our correction only part-way)? Compare raw model highs vs. truth by soil anomaly.
  2. July-August dew point miss vs. crop stage: do models under-forecast dew points at peak corn?
  3. Leaf-off (late October) and harvest: does the low's bias shift in the weeks after?
  4. Snow cover: lows are harder with snow on the ground (R-001 found 2.4 F vs 1.9 F, 40 nights); is the miss mostly one sign (models too warm over snow)?
  5. Done 2026-10-16: soil anomaly by season and station antecedent rain (above).

Log

  • 2026-10-17: the station mast stands a few feet north of a corn field (Brian). The crop cycle (planting, canopy, harvest, corn/soybean rotation) may leave a seasonal mark on the station's own readings; log crop and dates yearly.
  • 2026-10-17: siting details (Brian): the Davis station is on the same mast; air sensor about 5 ft (below the top of standing corn), anemometer about 12 ft. The 2026 corn is standing and dried down, harvest date to come. 12 ft is only about 4 ft above the canopy, so winds from the south (over the corn) likely read slower and gustier than north winds until harvest; check wind speed by direction before vs after harvest in the minute data.
  • 2026-10-16: thread opened; ERA5 soil and boundary layer history (2023 on) saved.
  • 2026-10-16: first exploration: soil moisture lines up with our highs' miss with the unexpected sign; no gain.
R-005Rain: moisture, lift, storm type, timing, and the gauge not startedupdated October 16, 2026

The question

Our rain chance is a calibrated blend of the models' rain amounts, the ensemble and the NWS discussion. It uses surface fields only. Rain needs moisture through a deep layer and something to lift it; models are often right about rain but wrong about when, or get showers right in general but not over one gauge. Where do our rain chances go wrong, and which of those causes can we measure?

Physics and literature

  • Classic MOS rain chance equations lean on the mean relative humidity of the column, 850 and 700 mb humidity and the model's rain amount; precipitable water, K index and vertical motion are secondary (NWS ER TA 99-1; MDL TPB 487).
  • Convective showers are hit or miss at a single point: a 60% chance of storms means scattered cells, not 60% of the area wet everywhere. Stratiform rain from a large system is far more predictable.
  • Tipping-bucket gauges undercatch, most in wind and in light rain (splash, evaporation, wetting loss). A 0.01 in tip threshold means drizzle can fall without counting (Dunn et al. 2025 review).

Data

  • Real runs (April 2026 on): 850/700/500 mb humidity, vertical velocity, water vapour, CAPE, lifted index, freezing level at true lead times.
  • upper_hist (2023 on) for learning.
  • Airports (asos.parquet): hourly precipitation and weather codes (RA, DZ, TS) to separate drizzle from rain and to see whether rain fell nearby but missed the gauge.

Ideas to chase

  1. Miss anatomy: sort discovery-year misses (wet when we said under 30%, dry when we said over 70%) by storm type (CAPE, lifted index), season and timing.
  2. Deep moisture: mean 850-500 mb humidity from the models as an extra input (perfect-prog first, then on runs).
  3. Timing: for missed rain, did it fall within 3 hours of a period boundary? If so the miss is timing, not occurrence, and a probability spread across the boundary might help.
  4. Gauge check: days when two or more neighbouring airports had measurable rain and our gauge had none (or 0.01 in). How often, and in what wind? An honest estimate of what the gauge misses.
  5. Showers vs. steady rain: separate calibration for convective and stratiform regimes.

Log

  • 2026-10-16: thread opened.
R-006Neighbours and upstream: what nearby stations see first exploringupdated October 16, 2026

The question

Weather moves. Most of ours arrives from the west and southwest. Eight airports within about 70 miles report every hour: temperature, dew point, wind, gusts, pressure, cloud layers with their heights, visibility and present weather. They measure what is happening while the models can only predict it, and weather from the west reaches them hours before it reaches us. Can they correct our nearest forecasts (tonight, tomorrow) and the live track?

Stations

Marion (MZZ, closest, about 15 miles), Kokomo (OKK, west), Grissom AFB (GUS, northwest), Logansport (GGP, northwest), Muncie (MIE, southeast), Anderson (AID, south), Huntington (HHG, northeast), Fort Wayne (FWA, northeast), Rochester (RCR, north), Warsaw (ASW, north). Outer ring (50 to 105 miles): TYQ, LAF, IND, SBN, AOH, DNV, DAY, GYY.

Ideas to chase

  1. Upstream cloud for bust nights (with R-002): at 8 PM, cloud cover and ceiling at the stations upwind (chosen by the 850 mb wind direction) vs. what the models have for our sky after midnight.
  2. Neighbour consensus: the average of their evening temperature anomalies vs. ours: is our station running unusually cold or warm, a siting signal?
  3. Siting: compare our station with Marion on clear calm nights. A consistent difference measures our cold-air pooling, and its size may depend on wind and season.
  4. Live track input: neighbour temperatures as an extra signal in Today's Track.
  5. Rain nearby (with R-005): did rain fall at neighbours when our gauge recorded none?
  6. Aviation forecasts (TAFs, Brian's idea 2026-10-16). Forecasters write hour-by-hour cloud, visibility, wind and rain timing for Fort Wayne (KFWA), Indianapolis (KIND) and Lafayette (KLAF), 24-30 hours out. The Iowa Environmental Mesonet archives them, already parsed (cloud layers and heights, weather, timing). Questions: do TAF cloud groups for tonight separate the clear-calm bust nights better than the models' cloud? Does TAF rain timing sharpen our 12-hour rain chances near period boundaries? Note: the forecast discussion we already read includes an aviation section that summarises the same TAFs, so the new information is the exact timing and structure. Pilot reports (PIREPs) and AIRMETs: too sparse or too broad for a point forecast.

What has been explored

2026-10-16, upstream clouds and bust nights (560 discovery nights, day-1 lows). Cloud cover from airport reports (the highest of the two lowest layers) at 8-9 PM, and through the night at all eight airports, compared with the models' night cloud.

Night endedNightsModels' cloudAirports' cloud overnightSurprise
4 F or more colder1738%30%-9 points
2-4 F colder7048%43%-6
within 2 F38546%39%-6
2-4 F warmer7450%51%0
4 F or more warmer1452%58%+6

Cloud surprises lean the expected way (clearer than forecast = colder) but weakly (correlation 0.13). The west airports' evening cloud does not predict the miss (correlation 0.06; leave-one-month-out MAE 1.620 vs 1.612 for our low, no help). Caveat: airport ceilometers only see clouds below 12,000 ft, so high cloud is invisible here. Conclusion: upstream low cloud is not the bust mechanism at our station; decoupling is (R-002).

Script: hyperlocal/research/r006_upstream_clouds.py, results r006_upstream_clouds.json.

2026-10-18, the outer ring (Brian: should the ring cover 12 to 24 hours of advection?). Eight more airports about 50 to 105 miles out: Indianapolis Executive TYQ (49 mi, SSW), Lafayette LAF (60, WSW), Indianapolis IND (71, SSW), South Bend SBN (76, NNW), Lima AOH (94, E), Danville DNV (98, WSW), Dayton DAY (99, ESE), Gary GYY (106, NW). History from 2023 (backfill_outer.py). Same question as the inner ring: does the outer upwind airports' model error now predict the station's error hours later, beyond its own error and the inner upwind airports? Downwind is the control.

Hours aheadOwn error+ inner upwind+ outer upwind+ outer downwind (control)
Freshest-view errors, discovery hours, wind 5 mph+ (about 7,850 h)
30.9400.9300.9280.931
61.0381.0361.0351.036
121.0971.0971.0971.098
Real forecasts 6+ h old, April 2 to July 15, 2026 (about 2,290 h)
41.8491.8011.7961.802
61.9781.9481.9511.952
122.1022.1062.1072.112

On windy hours (12 mph or more) the outer upwind side does beat the downwind side by 0.004 to 0.009 F at 4 to 9 hours, so the direction effect is genuine, but it is a hundredth of a degree. Conclusion: no. Beyond about 6 hours the forecast runs themselves have already taken in the air mass that is upwind (they are rerun every 6 to 12 hours from the same observations), and what is left of the station's error is local (siting, the ground, the corn) rather than carried in. The useful upwind reach is the inner ring and the first few hours (L-013). Not pre-registered: nothing worth testing. Scripts: physmodel/outer.py, outer_error_hours.parquet.

Data

asos.parquet, 2023 on (Iowa Environmental Mesonet). Live use would need the collector to fetch the same hourly reports (public, free).

2026-10-18, the ring goes live (ring_now.py). Brian pointed out the station sits inside a ring of automated airports (Marion 14.6 mi SSE, Kokomo 15.5 SW, Grissom 17.7 W, Huntington 23.2 ENE, Logansport 28.6 W, Rochester 33.1 NW, Muncie 37.6 SE, Fort Wayne 38.7 ENE, Anderson 40.3 SSE, Warsaw 41.7 N; Wabash has no automated reports). The Tower now reads their latest reports every 15 minutes (aviationweather.gov, table ring_obs) and pushes an "around us" summary to the Briefing: sky and low cloud bases, rain or snow and where, fog, wind, the station against the ring, and the air arriving from upwind (the upwind airports' temperature and dew point against ours, and the travel time at the current wind). Rochester and Warsaw were backfilled into the archive (asos.parquet) to close the ring north. New idea (Brian, after WxSim's upwind METAR advection): OBSERVED ADVECTION OF MODEL ERROR. If the upwind airports are colder or drier right now than the models think, that error should drift here within an hour or two, before the next model run corrects it. Test: for each hour, the upwind ring stations' (observed minus model) temperature and dew point, carried by the wind, against the station's next 1 to 3 hours' (observed minus model). Needs the models' values at each ring airport (the Open-Meteo previous-runs archive by point) for discovery, then fresh months live.

2026-10-18, observed advection of model error: first look (physmodel/advect_error.py, fetch_ring_models.py). Model values (GFS + ICON stitched first hours, the freshest run's view of each hour) fetched at all ten ring airports (data/research/ring_models.parquet). Each hour: every airport's error (observed minus models) and the station's; the ring wind (1/distance vector mean); upwind = airports within 50 degrees of where the wind comes from, downwind = within 50 degrees of where it goes (the control). Discovery hours (March 2024 to September 2025), wind 5 mph or more, about 8,200 hours, cross-validated by 6 blocks, uncertainty by resampling whole days. Temperature error 1/2/3 h ahead, mean absolute error, own error only -> + upwind: 0.667 -> 0.656, 0.852 -> 0.836, 0.945 -> 0.934 F; gains 0.011 (95% 0.005 to 0.017), 0.016 (0.009 to 0.024), 0.011 (0.005 to 0.016) F; downwind gain 0.000 every time; the whole ring in between. The gain grows with wind (2 h: 0.016 at 5-10 mph, 0.018 at 10-15, 0.024 at 15+). That is the signature of air actually arriving: real, but small (1.5 to 2.5%). Dew point: no upwind edge (moisture errors look regional). Caveat: the "model" here is the freshest run's first hours, so the models have little error left to advect; the same idea against our issued forecast (hours old, less fresh) could matter more, and is the natural next step (a 1 to 6 hour nowcast of the station's temperature).

2026-10-18, L-013 PASSED: a 1 to 6 hour nowcast. From a real forecast (ECMWF + ICON, the newest run out at least 6 hours before), nudged by the station's own error and the upwind airports' error: test hours July 16 to October 11, 2026, averaged over 1 to 6 h: forecast 2.13 F, + own 1.76 F, + upwind 1.68 F (gain 0.083 F, 95% 0.056 to 0.111), + downwind instead 1.73 F. Against hours-old forecasts the upwind effect is about ten times what it is against the freshest runs. See the lab notebook, L-013.

Log

  • 2026-10-16: thread opened; eight airports' hourly history (2023 on) saved.
  • 2026-10-16: upstream clouds explored: weak. Siting and neighbour-consensus ideas still open.
  • 2026-10-18: the ring nowcast went live; idea added: observed advection of model error from upwind airports.
  • 2026-10-18: observed advection of model error: real (upwind beats downwind, grows with wind) but small (about 0.01-0.02 F).
  • 2026-10-18: L-013 passed: the upwind airports improve a 1 to 6 hour nowcast by 0.08 F on top of the station's own error.
  • 2026-10-18: outer ring (8 airports 50 to 105 miles out) explored: adds about 0.00 to 0.01 F at 4 to 12 hours; not worth carrying.
R-007Frost and freeze: are the chances honest near the threshold? exploringupdated October 17, 2026

The question

Our frost (36 F or lower) and freeze (32 F or lower) chances come from a bell curve centred on our forecast low, as wide as the +/- range. That assumes our misses are the same size and shape on cold nights as on any night. Near freezing, physics says they may not be: dew and frost forming release heat and slow the last few degrees of cooling; wet ground gives up heat; clear calm nights can plunge.

What has been explored

2026-10-16, discovery nights (Mar 2024 to Sep 2025), forecasts 1-3 days ahead (1,695 forecasts).

Frost (36 F or lower), 408 occurred. Brier score 0.028 vs 0.183 for climatology (much better).

We saidNightsSaid on averageHappened
0-10%595%12%
10-30%5019%20%
30-50%3238%50%
50-70%3261%66%
70-90%4080%63%
90-100%33899%97%

Freeze (32 F or lower), 309 occurred. Brier 0.018 vs 0.149.

We saidNightsSaid on averageHappened
0-10%475%6%
10-30%4219%7%
30-50%2439%29%
50-70%3661%67%
70-90%4281%69%
90-100%24599%99%

Nights forecast within 6 F of freezing ended on average 0.55 F warmer than forecast (frost: 0.42 F warmer).

What it means so far: broadly reliable. Two hints, both from small samples: low freeze chances (10-30%) came true less often than we said, and high ones (70-90%) for both frost and freeze also fell short. Both fit a slight warm tendency near the threshold, as the condensation-floor physics predicts. A lead, not a finding: the bins hold only 24 to 59 nights each.

Script: hyperlocal/research/r007_frost_check.py, results r007_frost_check.json.

Ideas to chase

  1. Is the near-freezing warm tendency tied to the dew point (nights where the dew point is near or above the forecast low)? That would be a physical, testable correction.
  2. Ground heat: soil temperature (ERA5) on early-season frost nights.
  3. A skewed curve instead of a bell curve for cold nights.
  4. Test on this autumn and winter (fresh months) before anything changes: there will be many frost nights.
  5. Our own ground sensor: BUILT 2026-10-17. See "Ground sensor data" below. It measures real grass frost, so frost (grass at or below 32 F) can now be scored directly, not just freeze (station air). Once a season of nights is in: forecast the grass low as our air low minus a predicted grass-below-air gap (from clouds, wind, dew point). Exploration only until then; the first fair test is autumn 2027.

Ground sensor data (from 2026-10-17)

  • Table ground_obs in /hl/hyperlocal.db: t_utc, seq, probe, position, temp_f, vbat, rssi, snr; one row per probe every 5 minutes. Positions: grass (2 in above short grass), soil_2in, soil_4in, soil_8in, all at the station mast, beside the station's own air sensor (about 5 ft up). Rows with position test are readings taken while testing the probes (hand-warmed) and must never be used.
  • Site: a corn field begins a few feet SOUTH of the mast base (Brian, 2026-10-17). In October the sun is low (about 40 degrees at noon), so standing corn about 8 ft tall would shade a spot within roughly 10 ft north of it for much of the day: the likely reason the grass read 8-10 F below the air an hour before sunset. The corn also blocks part of the southern sky and breaks the wind at grass height. HARVEST IS A BREAK IN THE SERIES (full sun, more open sky, more wind): log its date, and the crop each year (corn and soybeans usually alternate).
  • Daily summaries and records are pushed to the site as fc/hl/ground.json (hyperlocal/ground.py).
  • Probe history, which changes the readings: installed 2026-10-17 about 5 PM EDT with a bare stainless grass probe (low emissivity, so it likely reads a little WARM on clear nights). Brian painted it white on 2026-10-18 at 2:03 PM EDT (18:03 UTC). Expect clear-night grass readings a degree or two colder after that, and sunny-afternoon readings lower too (the bare probe soaked up sun). Treat 18:03 UTC as a break in the series: grass records and the grass-minus-air fits use before and after separately. The 14:02 and 14:07 EDT readings (69 F, against 57 F just before) are the probe being handled, not weather. At the same visit Brian found the probe had FALLEN and was lying on the ground; it is now held in the printed cradle mount 2 in above the grass. When it fell is unknown: the 5-minute readings show no clear step (the only candidate is 1:16 AM EDT on 2026-10-18, +1.3 F), and the first evening (grass 12 F under the air, then held at the dew point) looks like a probe in the grass. Today's daytime readings (5 to 8 F BELOW the sunny air) fit Brian's report: the old spot was in the mast's shade (and on the ground). The new spot is in the sun, so daytime grass readings will now run ABOVE the air (sun on the probe and the grass top, normal for a grass-minimum probe; only its NIGHT readings are the grass temperature that matters for frost). So: the bare-probe stretch (2026-10-17 5 PM to 2026-10-18 2 PM EDT) is "first mount, position uncertain"; the clean series starts with the mount, 18:03 UTC. Battery/solar move into a weatherproof box around the same time.
  • First evening (2026-10-17, clear and calm): the grass ran 12 F below the station's air by 7:10 PM, then its fall stalled at 35.5 F, within 0.1 F of the station's dew point (35.4 F): the dew-formation brake, seen directly. Ground truth: Brian touched the grass about 7:45 PM and found dew had formed (grass 34.6 F, station dew point 35.4 F). The stall marks dew onset.

Log

  • 2026-10-18: grass probe painted white at 2:03 PM EDT and put in the printed mount 2 in above the grass (it had fallen to the ground at some point); series break.
  • 2026-10-17: the detailed-run page (fc/detail.php) shows a night grass ESTIMATE from a starting rule: grass = air - 12 F x clear x exp(-wind/8 mph), held no lower than 1.5 F under the dew point (insight.py GRASS_*). Fit these on the ground sensor's nights; the rule is labelled experimental on the page.
  • 2026-10-17: our ground sensor went in (grass + soil 2/4/8 in at the mast); data notes above. First evening: grass 12 F below the air, stalled at the dew point.
  • 2026-10-17: Freeze Warning night, case study C-001 (outcome pending at 2 AM; station cooling pace pointed to a low above our 31 F forecast). Score it next session as the first fresh-month night.
  • 2026-10-16: thread opened by Claude with Brian. Reliability check above.
R-008Hour by hour: our own forecast for every hour of the next two days L-003 missed its bar narrowly; next step pendingupdated October 17, 2026

The question

Our tested forecast works in 12-hour periods (the day's high, the night's low, rain chance per period), refreshed every hour. Everything finer on the pages is the raw model blend: the 3-hour strip's sky, wind and rain come straight from the models, and its temperatures follow a curve shaped to our high and low. Can we make our own hour-by-hour forecast for the first two days, corrected to the station the same way the highs and lows are? Brian asked for this on October 16, 2026.

Why it might work

  • The models have station-specific habits by hour, not only by day: how fast the evening cools, when the afternoon peaks, when the wind drops after sunset, how the dew point behaves at dawn. A daily correction can't fix timing.
  • The station's 1-minute history (2023 on) gives about 30,000 hourly truths to learn from.
  • The NWS does this operationally: its hourly guidance (LAMP, the Localized Aviation MOS Program, and the hourly National Blend) corrects models hour by hour and, for the first hours, leans on the latest observations. That last part is what our live track already does for the high and low.

Data

  • archive_<model>.parquet (/trainer/data): hourly model temperature, dew point, rain, cloud and wind at lead days 1-7, 2023 on. This is the training data: true lead times.
  • runs_<model>.parquet (/lab/data): real runs at exact lead hours, April 2026 on, for the honest recent test.
  • minutes.parquet: the station, every minute. Truth for every hour.

Plan (draft, to be pre-registered before testing)

  1. Targets: hourly temperature, dew point and wind speed for lead hours 1-48.
  2. Method: for each lead hour, correct the model blend with a ridge regression on the models' own values, the hour of day, season, and our daily high/low forecast (so the hourly path agrees with the daily numbers). For the first few hours, blend in the latest station reading (persistence), as LAMP does.
  3. Compare with what the page shows today (the curve plus the raw blend) on identical hours, walk-forward.
  4. Measures: hourly error by lead hour; the timing of the day's peak and the evening drop; wind speed error; how often the hourly path stays inside its range.
  5. Draft bar: at least 10% lower hourly temperature error than today's strip over lead hours 1-24, with the daily high and low no worse.

What has been explored

2026-10-16, discovery issues (March 2024 to September 2025, 415 issues scored, walk-forward). Mean hourly temperature error (F):

Hours aheadRaw model blendToday's stripHourly correction
1-62.062.021.64
7-241.841.951.76
1-241.891.971.73
25-482.212.192.12

Hour 1: 2.17 (blend), 1.82 (strip), 0.86 (correction): knowing how far off the blend is at 6 PM matters most early. Side finding: the strip is slightly worse than the raw blend away from the peak and the low, because it shifts every hour of a window by the high/low correction, which mostly belongs near the extreme. Formal test pre-registered as L-003 before any test-year run. Script: hyperlocal/research/r008_hourly.py.

2026-10-16, L-003 on the test year (358 issues). Hours 1-24: strip 1.946 F, correction 1.760 F, 9.57% better (bar 10%: fail). Hours 25-48: 2.326 vs 2.196 (pass). Better in 13 of 13 months (pass). 90% interval of the gain 7.7% to 11.4%. Hours 1-6 21% better, hours 7-24 5% better. Not passed; see the notebook entry for next steps.

Ideas to chase

  1. The evening drop: does a station-corrected cooling curve catch calm-night decoupling earlier (with R-002/R-003)?
  2. Hourly rain timing from the ensemble, calibrated to the gauge (with R-005).
  3. If it works, the briefing's 24-hour strip and Today's Track would both use it.
  4. When the high and low happen (added 2026-10-17, Brian). Our daily forecasts give how warm or cold, never when; the hourly curves borrow the models' timing unchecked. Score the models' time of the day's high and low against the station (1-minute history), by season and cloud, and on the odd days: (a) a strong cold front late morning or early afternoon (the high comes early, then the temperature falls like a rock); (b) the calendar-day high at 4 AM ahead of a front or with warm air overnight; (c) warm-air nights where the low comes in the evening and the temperature rises toward dawn. Fronts: WPC passages (data/fronts/passages.csv) and the station's own frontal signature (fronts.py / frontlib.py). Questions: are the models early or late on the front's arrival here, by how many hours, and does a timing fix make the hourly track (and the calendar-day high vs the 8 AM-7 PM high) more accurate? First look below (station climatology only, no forecasts scored).

2026-10-17, timing first look (station only, Feb 2023 to Oct 2026, 1,271 days). Script: hyperlocal/research/r008_timing_count.py, results r008_timing_count.json. Calendar-day high: 1-5 PM on 54% of days, 5-8 PM 28%, but midnight-6 AM on 10% (6-11 AM only 1.5%). Off-hours highs (before 11 AM or after 8 PM) run 35-38% of days in December and January, 22% in November and February, under 4% June to September. On the 128 days whose high came before 9 AM, the calendar high averaged 4.8 F above the 8 AM-7 PM high. Lows: 4-9 AM on 59% of days, but 9 PM-midnight on 22% (the low at the end of the day: cold air arriving), 46% of December days away from dawn. Daytime cold fronts (WPC passage 9 AM-6 PM, 60 days): the high came before 1 PM on 25%; 3-hour drop median only 2.3 F (many fronts are weak or mistimed by the 3-hourly analyses), but 7 dropped 10 F or more, up to 21.7 F (2026-03-11). Takeaway: off-hours timing is a cold-season matter, and big front drops are rare but real; the scoring of model timing is the next step.

Log

  • 2026-10-16: thread opened at Brian's request.
  • 2026-10-16: discovery exploration (above); L-003 pre-registered and published.
  • 2026-10-16: L-003 result: 9.57% vs a 10% bar. Not passed.
  • 2026-10-17: idea 4 (timing of the high and low, front days) added at Brian's request; station-only first look.
R-009WxSim: how good has it been, and could it help our forecast? L-006 pre-registered on fresh months (October 2026 to March 2027)updated October 17, 2026

The question

Brian runs WxSim, a local physics model of his site. How accurate have its forecasts been against the station, and could it add something our forecast lacks?

Data

  • WxSim forecasts: 5,651 runs, January 2018 to March 2023 (gaps mid-2019 to mid-2020, late 2020, April 2021 to January 2022), six runs a day, about 7 days ahead in half-hour steps. WorkingDrive "4. Archives/WxSim/wxsim/f*.txt".
  • Station truth for those years: Weather Display's NOAA monthly reports, February 2018 to June 2020 (calendar-day high and low). WorkingDrive "4. Archives/Meteorology". No station record for 2021-2022 has turned up.
  • Recent WxSim: the forecast-vs-actual database on Hostinger, hourly since June 4, 2026 (needs an export).

What has been explored

2026-10-17, WxSim graded against the station, 424 days (February 2018 to June 2020). The 6 PM run each day (10 PM if missing); calendar-day highs and lows. Benchmarks on the same days: persistence (tomorrow like today) and the NWS GFS guidance for Marion (MOS, the run out around 6 PM). Mean error (F), with average bias (+ = too warm):

WxSimNWS guidance (MOS)Persistence
Highs, day 14.46 (-1.1)3.29 (+0.2)6.13
Highs, day 24.89 (-1.4)3.73 (+0.8)8.55
Highs, day 35.40 (-1.7)not available9.51
Lows, day 14.00 (+1.0)3.00 (+0.2)5.41
Lows, day 23.58 (+1.0)3.12 (+0.6)7.42
Lows, day 33.75 (+1.1)3.54 (+0.5)8.36
  • WxSim beat persistence easily but trailed the NWS guidance by about 1 F on day-1 highs and lows, less for lows at days 2-3.
  • Within 3 F of the actual: about 47% of day-1 highs and lows. Misses of 8 F or more: 61 day-1 highs (14%) and 46 day-1 lows (11%).
  • Season pattern, day 1: in summer WxSim ran 3.2 F too cool by day and 3.8 F too warm at night: its day-night swing was about 7 F too small. In winter its lows ran 1.5 F too cold. A damped summer swing is what a model does when it treats the ground as too moist or the air too humid or cloudy, so it is worth checking WxSim's soil moisture and ground settings for summer.
  • Day-1 lows (4.00) were worse than day-2 lows (3.58), which is unusual. Unexplained; one possibility is how the 6 PM run handles its first night.
  • Caveats: 2018-2020 settings and equipment may differ from today; WxSim keeps standard time year round while Weather Display uses the PC clock (one hour at midnight in summer); MOS's day and night windows differ slightly from calendar days. For rough context only (different years and day definitions): our forecast today misses by about 1.6 F (lows) and 1.8 F (highs) on day 1.

Script: hyperlocal/research/wxsim_grade.py, results wxsim_grade.json.

2026-10-17, WxSim's saved forecasts decoded. The current WxSim (Weather PC) keeps every run as f<YYMMDDHH>.wxf: 4,010 readable runs, June 2023 to now. Format: each half-hour step starts with a line "Mon DD",hours (standard time), then the air temperature in Kelvin, converted as (K - 273.0) x 1.8 + 32 (matches latest.csv exactly). Script: hyperlocal/research/wxsim_extract.py.

2026-10-17, WxSim as an input, discovery years (March 2024 to September 2025). WxSim value = newest run finished by our issue time, max/min over our windows. Mean error (F):

OursWxSim aloneError correlationBest WxSim share (information only)
Highs, day 1 (289)1.8233.1790.3911%
Highs, day 2 (272)2.3843.7060.4218%
Lows, day 1 (276)1.6493.4360.367%
Lows, day 2 (258)2.0983.7490.398%

WxSim improved since 2018-2020 (highs 4.5 -> 3.2, lows 4.0 -> 3.4) and its errors only partly overlap ours. Leave- one-month-out, WxSim's information alone moved our error by: highs day 1 +0.009 (worse), day 2 -0.021; lows day 1 -0.009, day 2 -0.012, day 3 -0.007. A fixed bias term looked helpful for day 2-3 highs but that was our own forecast's bias on those days, not WxSim's information, so it was left out. The test year had WxSim on only about 70 days (it was down most of the year), too few to detect 0.01-0.02 F, so the formal test (L-006) uses fresh months. Script: hyperlocal/research/wxsim_input_test.py.

Ideas to chase

  1. WxSim as an input: L-006 (fresh months). WxSim's own WXSIM-Lite blend has not been fed since August 21, 2026 (fdata.txt stale; its loop is being fixed); if Brian turns the blend on, WxSim changes, so log the date.
  2. Grade the live WxSim (June 2026 on) the same way, to see whether today's setup does better than 2018-2020.
  3. If Brian adjusts WxSim's summer ground settings, the live grading would show the effect.

Log

  • 2026-10-17: thread opened at Brian's request; 2018-2020 grading above.
  • 2026-10-17: saved forecasts decoded; discovery exploration; L-006 pre-registered on fresh months.
R-010Our own physics: a night-cooling model built for this station night model live (L-007 passed); day model live for display (L-009 failed on forecast clouds; physics itself holds up)updated October 18, 2026

The question

Our forecast is statistical: it corrects the global models with years of the station's record. Its biggest misses are nights that go calm and cool on their own (R-002), linked to the inversion near the ground (R-003), which the global models are known to mix too much (Sandu et al. 2013). That is a physical process with well-understood ingredients. Can a small physics model of the night at this one spot, calibrated on the station's own minute data, predict those nights better than statistics alone, and feed our forecast as one more input? Brian asked for this on October 17, 2026: build our own physics of the station's air and ground, piece by piece, each piece earning its place against the station.

Physics (version 1: sunset to sunrise)

  • The ground radiates to the sky. Outgoing longwave from the surface minus what the sky sends back. Clear-sky sky emission from air temperature and humidity (Brunt, Swinbank, Brutsaert-type formulas); cloud adds back radiation depending on cloud height and cover.
  • Wind mixes warmer air down. Turbulent heat exchange between the ground and the air, scaled by wind speed and cut off as the air near the ground becomes stable. Below a minimum wind the layer decouples and the ground cools on its own (van de Wiel et al. 2012, minimum wind speed for sustainable turbulence).
  • The ground gives back stored heat. A simple two-layer soil (the force-restore method, Deardorff 1978) started from the soil temperature: warm wet autumn soil slows cooling.
  • Moisture puts a floor under the temperature. Dew and frost forming release heat near the dew point (the condensation floor, NWS TM 102).
  • The air aloft caps it. The 925 mb temperature and wind bound how far mixing can reach.

Version 1 design

  • Start: the station's own 6 PM readings (temperature, dew point, wind). Soil: ERA5 for history; the models' soil temperature live.
  • Drive each hour overnight with the forecast at issue time: cloud (low, mid, high), wind at 10 m and 925 mb, humidity, 925 mb temperature (from the real runs since April 2026; near-analysis upper air for learning).
  • A handful of free parameters (exchange strength, soil heat capacity, cloud back-radiation, decoupling wind), calibrated on discovery nights (March 2024 to September 2025) against the station's minute-by-minute cooling curves.
  • Output: a physics low and a physics cooling curve for tonight. Use: (1) "physics low minus our low" as an input to the statistical model, (2) a decoupling indicator for the +/- range (R-001), (3) the evening path for the hourly forecast (R-008).
  • Test like every other input: pre-registered plan and bar, the test year, then a winter confirmation on fresh months.

What has been explored

2026-10-18, version 1 built (hyperlocal/physmodel/: scm.py the model, nights.py inputs, calibrate.py, crossval.py). Brian asked to start building our own physics, to run alongside the statistical model, never replacing it. Version 1 is the night model designed above: a grass/soil skin radiating to the sky (Brutsaert clear sky, cloud by layer), turbulent exchange with the 2 m air (cut back by stability), dew and frost latent heat, force-restore soil, mixing toward the 925 mb air brought down dry-adiabatically, plus (added after the first fit) a share BETA of the air-mass change aloft (advection). 13 constants, fitted by optimisation on 474 dry DISCOVERY nights (March 2024 to September 2025), sunset to sunrise in 5-minute steps, against the station's minute record. Inputs: the models' stitched first hours (upper_hist, 4-model mean) and ERA5 soil: perfect prog, so learning only.

Results (low of the night, F, mean absolute error and bias):

  • In-sample fit: physics 2.01 (-0.01); clear and calm nights 1.94 (-0.18). The models' own near-analysis 2 m temperature: 1.46 (+0.76); clear and calm 1.93 (+1.61). Adding BETA (advection) cut the curve error from 2.44 to 2.18 F and removed biases of about +/-1.2 F on nights when the air aloft cooled or warmed.
  • Cross-validated (6 blocks of months, constants refit without each block): physics alone 2.13; a blend with the models 1.40 vs 1.46; physics only on clear, calm nights 1.33 overall, 1.56 vs 1.93 on clear, calm nights.
  • BUT the fair rival is a plain statistical correction of the models on clear, calm nights (what our forecast already does with its clear-and-calm feature): 1.51. Adding physics to that rival made it slightly WORSE (-0.09 F, 95% interval -0.13 to -0.06). So version 1's apparent gain is only the calm-night warm bias, which statistics already removes. Version 1 adds no new information. Results: physmodel/crossval_v1.json, constants physmodel/params_v1.json.

Reading the fitted constants: the optimiser chose a deep cooling layer (Z_EFF about 160 m), strong coupling and almost no stability cut-off, i.e. it gave up on the shallow, decoupled 2 m layer and modelled the night as one bulk layer. That is the physics that matters most on our worst nights (R-002), so version 1 cannot capture it by construction. And the comparison is harsh: the baseline here is the models' near-analysis, which has already seen the night.

2026-10-18, version 2 (two air layers: a shallow 2 m layer that can decouple under a bulk night layer; physmodel/scm2.py, calibrate2.py). Fitted freely it reached 1.98 F in-sample (version 1: 2.01) by abandoning the shallow layer again (a 180 m "surface layer", a wind floor that erases calm). Held to physical ranges it was worse (2.15 F) and pushed against every limit. Driven by the STATION's measured wind instead of the models' it improved only to 1.92 F and still would not decouple. So the second layer is not where version 1 loses; shelved for now.

2026-10-18, the fair comparison and L-007. Against OUR day-ahead low (walk-forward, discovery nights), adding the cross-validated version 1 physics low (started at sunset) cut the error 1.63 to 1.56 F, while the same sunset readings used statistically added nothing (1.66). Pre-registered as L-007 and run on real forecast runs (ECMWF and ICON 12Z, April to October 2026, 149 dry nights): ours 1.52 F, ours + 0.25 x (physics - ours) 1.38 F, control with the fresh runs' own 2 m low 1.54 F, gain positive in 99.9% of resamples: PASS. See the lab notebook, L-007.

2026-10-18, the DAY model (physmodel/days.py, dayscm.py, calibrate_day.py; live in physlive.py). Brian asked for daytime physics with the same rules (published, runs on the Tower). Sunrise to sunset: clear-sky sunshine from the sun's height dimmed by low, mid and high cloud; net longwave; a share into the soil; an evaporative fraction from topsoil moisture and the growing season; the rest heats the air, which first burns off the night's inversion and then builds a mixed layer by encroachment (Carson 1973) through the morning's 925/850/700 mb profile; the 2 m air follows the mixed layer plus a hot layer at the ground on sunny, calm days; advection from the 850 mb change. Fitted on 455 dry DISCOVERY days. With all constants free the fit went unphysical (a negative albedo), so albedo 0.20, soil share 0.15 and entrainment 0.2 are fixed and the rest bounded. Version 1.1 added snow albedo (from 5 cm of snow), an uneven growing season (crops dry down in the fall), a calm-day hot layer and a morning inversion depth; that took the in-sample error on the high from 2.22 to 2.03 F (sunny days 1.75 F, better than the models' near-analysis 1.87 F; cloudy days 2.43 F are its weak spot). Fitted constants: low cloud blocks 79% of the sun, mid 62%, high 19%; evaporative fraction 0.49 + 0.52 x (moisture - 0.30) + 0.36 x (season - 0.5); inversion 334 m. Cross-validated against OUR walk-forward high: ours 1.68 F, ours + sunrise readings (statistical) 1.67, + day physics 1.63: gain 0.05 F, 95% interval -0.02 to 0.11. Not proven, so no real-run test yet and nothing blended; the day run is shown on the Physics page for interest. Driving it with the models' own sunshine instead of our cloud dimming was worse (stuck at a +2.8 F bias). Its highs come about 40 minutes late on average (mixing keeps going until the sun is low).

2026-10-18, the station's solar sensor (physmodel/solar.py, cloud_skill.py). The Davis pyranometer, logged by Weather Display every minute since January 2023, as 5-minute sunshine (370,076 values to October 14, 2026; data/research/solar5.parquet). Calibration is steady: the clearest middays read 0.98 to 1.10 of the clear-sky formula in summer and about 1.10 to 1.15 in winter (the formula runs low at low sun), with no drift year to year. (Earlier uses: tested as a statistical temperature input on October 14, no gain; shipped as front evidence, the sky clearing behind fronts, on October 15.)

  • Cloud forecasts against the sensor, next-day daytime clearness (8 AM to 5 PM), 12Z runs, April 3 to October 13, 2026, 183 days (error on a 0 to 1 scale / correlation): ECMWF + ICON own radiation averaged 0.097 / 0.86; ICON 0.101 / 0.84; ECMWF 0.116 / 0.82; our cloud-layer dimming of their clouds 0.136 / 0.81 (ICON's clouds through our dimming: -0.19 bias); yesterday's clearness 0.226 / 0.18; the month's average 0.198 / 0.05. The models' radiation schemes know cloud thickness; three cloud layers do not. For sunshine, use the models' radiation.
  • CORRECTION (same evening): the day fits with a switch on (measured sunshine, the models' sunshine) were wrong. A bug in calibrate_day.py scored every candidate with the DEFAULT model during fitting, so those constants were tuned for cloud dimming and only the report used the switch. The night model (no switches; L-007) and the cloud-forecast scores above (no fitting) are unaffected. Rerun correctly (cross-validated high, gain over ours + sunrise info): measured sunshine 2.24 F, gain 0.05 F (95% -0.04 to 0.13); the models' sunshine 2.42 F, gain 0.00. So with the old advection, even perfect sunshine barely helped: the bottleneck was advection after all.

2026-10-18, day ADVECTION version 2. The models' 925 mb, 850 mb and 2 m temperatures change through the day for two reasons: air moving in (advection, what we want) and the models' own daily heating (which our physics does itself). Version 2 removes the typical daily cycle for the month and UTC hour (from the stitched archive, discovery years only) and adds the remaining "weather" change since sunrise, weighted per level (fitted: 925 mb 0.71, 850 mb 0.02, 2 m 0.16; the low-level flow about 2,500 ft up carries it). Cross-validated high, discovery days:

Day modelPhysics aloneGain over ours + sunrise info (95%)
Advection v1, our cloud dimming2.32 F0.05 F (-0.02 to 0.11)
Advection v2, our cloud dimming1.68 F0.14 F (0.03 to 0.25)
Advection v2, measured sunshine (perfect clouds)1.51 F0.20 F (0.08 to 0.32)

Our walk-forward high is 1.68 F on the same days. Rule on discovery (v2, cloud dimming): high = ours + 0.408 + 0.498 x (physics - ours). Perfect clouds would add more on top: cloud forecasting pays once advection is right. Pre-registered as L-009 (real 00Z runs, April to October 2026). Files: params_day_v1_adv2.json, rerun_*.txt.

2026-10-18, L-009 FAILED (day physics on real 00Z runs, 135 dry days). Ours 1.46 F, rule 1.55 F, fresh-run control 1.35 F, physics alone 2.08 F (bias -1.23). Diagnostic on the same days and runs with the MEASURED sunshine: physics alone 1.48 F, level with ours. The physics and advection hold up; the cloud-to-sunshine step failed (right on average, 96% of measured, wrong on individual cloudy days). Next: the models' own radiation as the sunshine input, explored on discovery, tested on fresh days only.

2026-10-18, the day model's sunshine rebuilt on the models' radiation (step 1 after L-009), discovery only. Sensor calibration on discovery daytimes: measured / models' sunshine 0.907. (a) The physics fitted on MEASURED sunshine, then driven by 0.907 x the models' sunshine, cross-validated (blocks refit): physics alone 1.63 F (ours 1.68), gain over ours + sunrise information 0.10 F (95% -0.01 to 0.21); rule ours + 0.30 + 0.54 x (physics - ours). (b) Everything refit with the models' sunshine: 1.73 F, gain 0.08 F (-0.02 to 0.19), and the fit ran to its limits (it wanted 1.3 x the models' sunshine while the sensor says 0.9 x: constants trading off, not physics). (a) is anchored to the sensor at both ends and is the version frozen for L-010 (fresh days from October 19) and put live. L-008 (the night model live, against our issued low at sunset) was pre-registered at the same time.

2026-10-18, PRECIPITATION TYPE (physmodel/ptype.py, ptype_eval.py, fetch_levels.py, l011.py). The energy method (Bourgouin 2000) on the profile above the station, verified against what 8 nearby airports reported (Marion, Kokomo, Grissom, Muncie, Huntington, Fort Wayne, Logansport, Anderson; freezing rain only where sensors can report it: Fort Wayne, Grissom, Muncie). With only 925/850/700 mb: rain vs snow worse than a 33 F surface rule (marginal hours 70.8% vs 80.9% at Marion); freezing rain caught 32% with 83% of ice calls right. Added 10 levels (1000 to 600 mb, GFS and ICON stitched first hours, cold seasons 2023 to 2026, data/research/levels_*.parquet): freezing rain caught 41% (temperature) to 50% (wet-bulb profile), calls about 80% right; rain vs snow still worse than the rules (too snowy just above freezing: rain hours it called snow had the station at 35.5 F). Hybrid (physics decides ice, station wet-bulb 32.5 F decides rain or snow) on the two exploration winters: 95.6% vs 95.1%. L-011 on the unseen winter 2025-26: hybrid = wet-bulb rule (97.0%, marginal 76.2%), both beating the 33 F rule (marginal 71.3%); ice: 18 reported hours only, 1 caught, 16 of 18 ice calls during snow. Lesson: the wet-bulb rule is the solid gain; our ice detection is not shown to work.

2026-10-18, FOG, first look (discovery nights; physmodel/fog_nights.csv). Truth: visibility under 1 mile at Marion or Huntington during the night (about 1 night in 15 at any one airport; the two agree on only 25 of their 82 fog nights: fog is very local), and the station's own saturation: its Davis humidity sensor tops out at 98% (night maxima, 99th percentile), so 97% or more for 3 hours stands for "saturated". Station 97%+ for 5 hours or more came with regional fog on 50% of nights (base rate 9%). Ranking skill (AUC) on 474 dry discovery nights, regional fog / station saturation: night model's closest air-to-dew-point gap 0.63 / 0.67; its saturated calm hours 0.60 / 0.72; crossover (physics low minus the sunset dew point) 0.66 / 0.70; the models' near-analysis 2 m humidity through the night 0.90 / 0.90 (flattered, but the gap is far beyond that). The night model was fitted for temperature; its moisture (dew deposition plus the models' drift) is too crude for fog, which needs temperature and dew point right to within a degree at the same hour. A fog-capable night model needs its own moisture budget (deposition, evaporation from wet ground, mixing of drier air from above), calibrated on the station's humidity and the grass.

2026-10-18, night version 3: a MOISTURE BUDGET (physmodel/scm3.py, calibrate3.py; live physlive.integrate_v3). Version 1's temperature physics (frozen) plus water: dew deposits on the grass (drying the air), dew and then a share of the soil evaporate, fog forms beyond saturation (latent heat; fog sends longwave back like low cloud). Version 3a mixed the 2 m air's moisture toward the 925 mb air, which is about 9 F drier in dew point at sunset: the dew point collapsed (7.1 F error) and the lows went too cold (4.5 F). Version 3b keeps the models' own 2 m moisture and lets our physics add only the LOCAL departure (dew, evaporation) that fades back over TAU_Q hours. Fitted (discovery dry nights, temperature constants frozen): moisture layer 86 m, TAU_Q 3.1 h, soil evaporation almost nil at night, fog longwave 0.49 of low cloud. Cross-validated: dew point curve error 1.67 F (version 1 1.77), low 2.03 F (2.01); fog ranking skill, regional / station saturation: version 1 0.63 / 0.67, version 3 0.67 / 0.73, the models' near-analysis humidity 0.90 / 0.90 (flattered). Our ~2 F night temperature error is too large for fog, which needs air and dew point within a degree. The fair test against the models' FORECAST humidity at sunset is pre-registered as L-012 on fresh fall-to-spring nights; the Tower logs both signals from October 18.

2026-10-18, the 24-HOUR CYCLE (physlive.chain). Day and night joined: from the most recent sunrise or sunset (the station's reading then) each half runs to its end and the next starts where it finished, day (the L-010 version) into night (version 1) and on, four halves (about two days), with ECMWF + ICON clouds, wind and air mass. Shown on the Physics page against our forecast and the station; never blended. Each start's predicted extremes are logged (phys_runs kind 'chain') so a later test can judge the physics' own next-day high and low; first live chain (from the October 18 sunrise): today 62.4 F (ours 63.2), tonight 33.4 (34.5), Monday 65.8 (67.8), Monday night 36.1 (38.6): cooler than ours, more so further out.

2026-10-18, FAIR-WEATHER CUMULUS (physmodel/cumulus.py, ring.py). Cumulus forms when the mixed layer's top reaches the condensation level of the mixed-layer air (125 m per deg C of temperature minus dew point; mixed-layer moisture from the models' 2 m, 925 and 850 mb humidity averaged over the depth mixed). Truth: days with a clear morning and no weather, cumulus (FEW/SCT/BKN, base 1,500 to 9,000 ft) 10 AM to 5 PM. First against Marion alone (242 such days, cumulus on 41%, onset mostly 10 AM to noon, first base median 4,600 ft): the L-010 day model reached the condensation level on only 2 of 160 exploration days (ranking skill 0.76). Its afternoon mixed layer is too shallow: median 3,370 to 3,500 ft vs ERA5's boundary layer 4,810 ft (day-to-day correlation 0.73); fitted to temperature only, it got its warmth partly from the hot layer at the ground instead of depth. Refit with ERA5's depth in the loss (params_day_v1_obs_adv2_blh.json): 3,960 ft, temperature skill unchanged (high 1.51 F cross-validated, gain over ours 0.21 F). THE RING (Brian's idea): the six airports within 35 miles (Marion 14.6 mi SE, Kokomo 15.5 SW, Grissom 17.0 W, Huntington 23.2 NE, Logansport 28.6 W, Rochester 33.0 NNW; Wabash has no automated reports), weighted by 1/distance, as a consensus for the station (ring.py; Rochester and Warsaw were backfilled into the airport archive to close the ring to the north). 255 clear-morning days, cumulus on 35%. Ranking skill: physics 0.84 (Marion-only truth: 0.76), the models' near-analysis low cloud 0.92 (flattered). As yes/no it needs a 300 to 600 m allowance (the depth bias): 300 m: 81% of calls right, 38% caught; 600 m: 58% right, 88% caught. Onset off by 2.2 to 2.6 h; base off by 1,500 to 1,900 ft, worse than the forecaster's 227 ft per F rule. Conclusion: the physics knows which days lean to cumulus, not when or how high; the mixed layer is too crude (too shallow, three upper levels).

A pattern across the session: our physics adds real information where the models carry systematic LOCAL biases in temperature (the night low, L-007; the day high with measured or model sunshine, L-010 pending); for clouds, fog and precipitation type the models' own fields are stronger, and the useful physics there is simple and local (the wet-bulb rule; the station's own humidity ceiling for fog).

Road map toward Brian's goal (anticipating clouds, rain, snow and storms ourselves, which drive the temperatures):

  1. Afternoon cumulus: when the mixed layer reaches its condensation level (from the dew point), clouds form; that would let the day model make its own fair-weather clouds and cap its own heating.
  2. Storms: lift a parcel from the mixed layer through the models' upper air (instability, a lid) for our own thunderstorm potential and timing.
  3. Rain and evaporative cooling, then precipitation type from the column (freezing level, a warm layer aloft).
  4. Fog and dew at night from the night model's dew point and the grass.
  5. Join night and day into one continuous 24-hour cycle, each half starting from where the other ended.

Do the small effects add up? (2026-10-18, L-014)

Brian's question: many tested effects were each worth about 0.02 F and set aside; together, do they become something big? Every small candidate (the other forecast program, the inversion at issue time, soil moisture, the ring's error and the upwind airports' error at issue time) was put next to our forecast in one penalised regression, with and without the physics, cross-validated by 6 blocks of months on discovery days (research/combined.py).

Lows (225 nights), mean absolute errorFHighs (232 days)F
Ours1.71Ours1.70
+ physics1.61+ physics1.47
+ the five small effects, no physics1.65+ the five small effects, no physics1.76
+ physics + inversion1.59+ physics + inversion1.49
+ all six1.59+ all six1.53 to 1.56

They do not add up. Two reasons: they overlap (the other program and the inversion carry part of what the physics already knows, correlation 0.2 to 0.3), and the ring and upwind errors fade within hours, so at the next day's low or high they are noise (they belong to the 1 to 6 hour nowcast, where they PASSED in L-013). The only small piece left on top of the physics was the 6 PM inversion for lows. L-014 tested it on the 149 real-run nights: 1.38 -> 1.37 F, gain 0.014 F, positive in 72% of resamples: FAIL, the size discovery predicted. The physics is the one large piece.

Wet weather (2026-10-18, L-015 and L-016)

Version 1 of the night physics ran only on dry nights. On wet nights it ran far too warm: +1.7 F on average and +4.1 F with a quarter inch of rain or more (discovery, perfect prog). The cause was physics, not tuning: it brings the 925 mb air down to the ground along the DRY adiabat (9.8 K per km). In rain the air below the cloud is saturated and the air follows the MOIST adiabat (about 6 K per km): 2.5 K (4.5 F) colder at the ground on heavy-rain nights, the size of the bias. physmodel/scmw.py adds, on top of version 1's dry constants (identical when it is dry):

  • the moist adiabat in rain (full at 0.15 mm/h smoothed over 2 hours: fitted);
  • falling rain cooling the air toward its wet-bulb (the fit made it small once the moist adiabat was in);
  • a wet lawn evaporating after rain (fitted: about 4 mm counts as fully wet);
  • the rain's own heat, snow melting in air above freezing (holding it at 32 F), and freezing rain giving up the heat of fusion on a sub-freezing lawn, with a "drip" share that runs off, ice tracked and melted later. The discovery years have about 30 hours of snow and 1 hour of freezing rain on our nights, so these keep their physical starting values; this winter's nights check them.
Wet nights, low (F)Discovery (130, CV)Test year (30, real runs)
Physics version 12.62 (bias +1.71)2.79 (bias +2.55)
Physics + wet weather1.99 (bias +0.49)1.94 (bias +0.66)
Ours1.571.38
Ours + 0.25 x (wet physics - ours)1.521.38 (L-016: FAIL)

The wet physics makes the night model right on rainy nights, but it brings our forecast nothing there: rain-night lows are set by the rain and the air mass, which the statistical forecast already carries.

The day model needed no add-on. A wet-weather version (rain cooling toward the wet-bulb, a wet-ground store) made highs worse (bias -2 F): the day model already sees a rain day through the runs' dark sunshine and the soil moisture, and the add-on counted the water twice. Unchanged, the day physics is worth MORE on rainy days than on dry ones:

Wet days, high (F)Discovery (166, perfect prog)Test year (43, real 00Z runs)
Ours2.142.08
Day physics alone1.622.06
Ours + 0.30 + 0.54 x (physics - ours) (the L-010 rule)1.63 (CV share)1.74 (L-015: PASS, gain 0.33 F, 99.7% of resamples)

Our forecast misses rain-day highs by more than dry-day highs (2.1 vs about 1.5 F), and the physics, started from the station's sunrise reading and fed the runs' sunshine, catches a third of the miss. Scripts: physmodel/scmw.py, daywet.py, calibrate_wet.py, calibrate_daywet.py, l015.py, l016.py.

Snow on the ground (2026-10-18, L-017)

Version 1 ignored snow cover and ran far too warm over snow: +5.8 F on last winter's nights with 2 inches or more. Snow conducts heat a fraction as well as soil, so the soil's warmth reaches the surface through the snow in series, k = 1 / (1/k_soil + depth/k_snow), and a snow surface cannot warm past 32 F (physmodel/scmw.py, item 7). Fitted on the learning winters (40 dry snow nights): snow conductivity 0.118 W/m/K, the textbook range for settled snow; the fit did not support a thin fast-chilling surface layer. Held-out winter 2025-26 (perfect prog, a physics check: no real runs exist for that winter):

Night low, MAE (F)Without snowWith snowModels' own
Snow 5 cm or more (23 nights)6.14 (bias +5.79)4.53 (bias +2.23)2.77
All snow nights (43)4.59 (bias +2.62)4.02 (bias +0.26)2.12

A large step (L-017 passed), not the end: deep snow is still about 2 F too warm, likely because the learning winters had only 3 nights that deep. The ground probes will sit under real snow this winter and measure the insulation directly. Snow depth live comes from Brian's reports (fc/snow.php), carried forward by the Tower (snowpack.py), with the grass probe as a burial detector and the models' snow depth as the fallback.

The calibration run (2026-10-18, L-018)

Idea from the notes review: start each run from a state tuned to the station's recent past. For the day model the uncertain state is how wet the ground behaves. For every past day, the evaporative share that best reproduces the station's warming curve with the measured sunshine was inferred (calib_run.py). One day's value is mostly that day's noise (correlation with the day before 0.13); a two-week average holds a slow signal (0.23), and calm clear days carry it best (0.30, half the noise). On discovery days, half the two-week estimate improved the day physics (1.465 -> 1.417 F) and the L-010 rule (gain 0.04 F). With real forecast runs on 178 test-year days it added nothing (gain -0.004 F, L-018 FAILED): the forecast sunshine and air mass carry far larger errors than the ground's slow wetness. The grid's soil moisture stays as the day model's input. By-product: the L-010 rule, unchanged, beat ours on all 178 days (1.61 -> 1.53 F, dry and wet); its live test (L-010, dry days) continues.

The physics ensemble (2026-10-18, L-019)

Running the night physics once per forecast model and averaging the results (as forecast ensembles do), instead of once on the averaged forcing, did not help on discovery nights (2.12 vs 2.08 F, four models), even on nights when the models disagreed about low cloud; the constants were fitted on averaged forcing, which favours it. Adding GFS to the averaged forcing looked better on discovery nights (ECMWF + ICON 2.14, + GFS 2.06 F) but FAILED with real forecasts (1.79 -> 1.85 F, L-019): its help came from its first hours, which are close to an analysis. Real-run members alone: GFS 2.43, ECMWF 2.18, ICON 1.86 F; the ECMWF + ICON average beats each. Lesson for this program: an input's value in the stitched first hours does not transfer to forecasts; test every input on real runs. The spread of the members is a modest confidence signal (tighter half of nights 1.6 F, wider half 1.95 F).

The day model's cold bias and the crop calendar (2026-10-18, L-020)

With real forecasts the day physics ran about 1 F too cold. Swapping inputs on the exploration months (April 2 to July 15, 2026) split it: forecast inputs about 0.6 F (sunshine timing more than amount: forecast sunshine runs 11.7% over the pyranometer, close to the 0.907 calibration; plus the morning upper air and the air moving in), the model itself the rest. And the model's own error repeats every year by season: too cold in spring and fall, too warm in July-August and winter. Its evaporation followed a smooth season peaking in mid-July; real fields here are bare in spring, a closed transpiring canopy in July-August, and drying in the fall. A second seasonal harmonic (a crop calendar, refitted on discovery days with measured sunshine) fixed much of it (discovery 1.28 -> 1.19 F, 2023 1.59 -> 1.41 F), and a +0.84 F offset for real forecasts (fitted on the exploration months) the rest. On held-back months (L-020 passed): 1.79 -> 1.59 F, bias -1.22 -> -0.37 F, now better than ours alone (1.71 F). Midsummer (August) is still about 1.4 F cold: the next piece, probably the corn canopy's peak transpiration or the hot layer.

Clouds: what they cost, and the midday sunshine update (2026-10-18, L-021)

Neither model forecasts clouds itself; both inherit ECMWF and ICON's. With real forecasts (2026), the sunshine reaching the station differs from the forecast by 10% of clear-sky on a typical day; on the 10 much-darker days our high missed by 2.5 F (1.3 F too warm), on days the sunshine was about right 1.4 F. At night, against the cloud the airports reported, the low missed by 1.3 F when the cloud forecast was right and 1.4 to 1.7 F when not. Cloud surprises explain about 10% of our high's error and 20% of the day physics'; with the measured sunshine the day physics would improve from 1.63 to 1.43 F. The morning's sunshine surprise alone says little about the afternoon (correlation 0.09: morning clouds burn off, afternoon cumulus is its own). Restarting the day physics with the sunshine measured so far (and the last two hours' measured/forecast ratio, fading) and blending it with ours and the station's error improved the high on held-back months at 11 AM, noon and 1 PM (gains 0.07 to 0.11 F over the station-error update), but at the pre-registered 1 PM not consistently enough (86% of resamples): L-021 failed narrowly. A live trial would settle it. The night version (inferring the real cloudiness from the first hours of cooling after sunset, with the grass probe) waits for a few weeks of the mounted probe.

What would make it better (version 2)

  • Two air layers: the 2 m layer that decouples and a bulk layer above it (the "air mass"), so a calm night can run away at the ground while the layer above cools slowly. Calibrate the 2 m layer on the ground sensor's grass and station curves, and the stability constants on the nights the grass and air separate.
  • Start from the station's evening state (sunset temperature, dew point, the first hour's cooling rate) and the ground sensor's soil temperatures, then judge it where it could actually help: a 6 PM forecast of tonight's low with the 12Z runs' forecast clouds and winds, against our own issued low at the same hour. That needs cloud layers and 10 m wind from the real runs (to add to research_data.py), and a pre-registered plan before any test-year night.
  • Rain nights (evaporative cooling, wet ground), then daytime (sun, mixing depth: highs).
  • A grass-level temperature sensor at the station mast (and a soil probe a few inches down): the ground's actual temperature to start and check the model, and the ground-to-air difference in real time as decoupling begins. Tabled by Brian (see R-007); valuable here once it has a season of data.
  • An infrared sensor looking at the grass measures the radiating surface directly (check Meshtastic support first).

Later pieces

  1. Afternoon mixing for highs (with R-003): how deep the sun mixes the air, from the 850/925 mb temperatures.
  2. The shape of the hourly temperature curve (with R-008).

Questions for the library

  • Simple published nocturnal boundary-layer or surface energy-balance models tuned to single stations: which formulations worked best for minimum temperature?

Log

  • 2026-10-17: thread opened at Brian's request; version 1 designed.
  • 2026-10-17: the ground sensor went in the same day (R-007). Version 1 can now start from MEASURED soil temperature (2, 4, 8 in) instead of model soil, and each night's grass curve checks the radiation and exchange parameters directly (first night: grass 12 F under the air at dusk, then held at the dew point). Brian asked again for our own physics model; next step is building version 1 on the station's minute history.
  • 2026-10-18: version 1 built, fitted and cross-validated (above): matches the models on calm nights but adds nothing beyond a statistical correction. Version 2 plan: two air layers, evening start, real-run inputs.
  • 2026-10-18: version 2 explored and shelved; L-007 pre-registered and PASSED with version 1. Next: run live on the Tower and test against our live-adjusted low (L-008).
  • 2026-10-18: day model v1.1 built, fitted, cross-validated (gain 0.05 F, not proven) and put live for display; road map to clouds, storms and precipitation added.
  • 2026-10-18: solar sensor brought in; models' own radiation forecasts beat our cloud dimming.
  • 2026-10-18 evening: fitting bug found and corrected (switched day variants); advection v2 makes the day model add to our high (0.14 F cross-validated); L-009 pre-registered.
  • 2026-10-18: L-009 failed; the cause is the cloud-to-sunshine step (with measured sunshine the physics matches ours on the same days).
  • 2026-10-18: day sunshine rebuilt on the models' radiation (sensor-calibrated); L-008 and L-010 pre-registered; L-010 version live.
  • 2026-10-18: precipitation type explored and tested (L-011): the wet-bulb rule beats the 33 F rule; physics ice detection not confirmed.
  • 2026-10-18: fog first look: the night model as built is a poor fog forecaster (AUC 0.6-0.7 vs the models' humidity 0.9); needs a moisture budget.
  • 2026-10-18: night moisture budget (version 3) built: dew point slightly better, fog still weak; fog log live; L-012 pre-registered.
  • 2026-10-18: 24-hour cycle built and put live (display; extremes logged for a future test).
  • 2026-10-18: fair-weather cumulus explored with the ring of airports as truth: ranking yes, timing and base no; mixed layer refit with ERA5 depth.
  • 2026-10-18: the small effects combined (L-014): they overlap or fade by the next day; the physics is the one large piece.
  • 2026-10-18: wet weather: the moist adiabat fixes the night physics in rain (L-016 failed vs ours); the day physics passes on wet days (L-015).
  • 2026-10-18: snow cover added to the night physics (L-017 passed on the held-out winter); snow reports live.
  • 2026-10-18: the calibration run (ground wetness from the station's own curves) explored and tested: L-018 failed.
  • 2026-10-18: physics ensemble explored and tested: L-019 failed; live forcing stays ECMWF + ICON.
  • 2026-10-18: day cold bias diagnosed and fixed (crop calendar + real-forecast offset): L-020 passed.
  • 2026-10-18: cloud cost measured; midday sunshine update tested (L-021 failed narrowly, consistent direction).
  • 2026-10-18: observed clouds tried two ways at night (the ring airports' reports, L-023; MOS and National Blend sky cover at Marion, exploration): neither helps the physics; its cloud constants are tuned to the models' layered cloud. The night restart from the station's reading is what helped (L-023, narrow fail).
L-024passed (October 15, 2026); promoted October 18, 2026; live check running

Updating today's high and tonight's low with how the station is running, once the period has begun

opened October 15, 2026 · by the Claude, with Brian, in a session
The question

During the day, does the gap between the station's current temperature and our forecast curve for that hour tell us how today's high will end up (and after the evening start, tonight's low)?

Why it might work

Written into the notebook on October 18, 2026: the test itself was pre-registered and run on October 15 (hyperlocal/data/livetrack_prereg.txt, livetrack_results.txt) and its result drove the Today page's live tracker, but the Forecast table kept showing the hourly rebuild, which never looks at the station. On October 18 at 5:33 PM it still showed a high of 64 F after the station had reached 68 F. Brian asked for the forecast to be calibrated to the station once a period is underway, and for proof on real days.

The plan, written before the test

Pre-registered October 15, 2026 (hyperlocal/livetrack.py). Forecast curve for an hour = the 4-model hourly blend (lead 1) shifted so its peak matches our forecast high (trough for the low). Running gap e = station temperature now minus the curve now. Adjusted high at hour h = max(highest so far, our forecast from before the window + a_h + b_h x e), a_h and b_h fitted per hour (lows: the mirror). Walk-forward: a_h, b_h fitted only on days before each test month (8-day gap); test October 1, 2025 onward. Baselines: (1) our morning forecast; (2) the so-far rule, max(highest so far, our forecast). Promoted October 18, 2026 with Brian's OK: the Forecast table, Today cards and discussion show the adjusted number once a period has begun (with its tested 80% range), the forecast made before the period began shown under it and still the one the main scoreboard grades. Live check: every hour the adjusted value (ours_live) and the so-far rule (ours_floor) are logged; How it works grades them at local 11 AM and 2 PM (highs) and 9 PM and 11 PM (lows), same days in every column, beside the hourly rebuild and the NWS at the same moment.

Pass/fail bar: Test bar (October 15): show it only if, averaged over 10 AM to 4 PM (highs) or 9 PM to 5 AM (lows), it cuts mean absolute error by at least 10% against the so-far rule, and is never worse than that rule by more than 0.1 F at any single hour. Live check (October 18): after 60 scored days, if the adjusted value is worse than the so-far rule at 2 PM or at 11 PM, the pages go back to the so-far rule and the result is written here.
Results

Test, October 1, 2025 to October 2026, walk-forward: highs 356 days, bar hours: so-far rule 1.25 F to adjusted 0.99 F (21% better), worst single hour 0.07 F better than the rule: PASS. Lows 353 nights: so-far rule 1.41 F to adjusted 1.17 F (17% better), worst hour 0.06 F better: PASS. The gain grows through the day as more of the running gap carries into the final number (high: 21% of it at 8 AM, 64% at 2 PM, 75% at 4 PM).

Today's high, mean absolute error (F) by local standard hour, test days
HourMorning forecastSo-far ruleAdjusted
10 AM 1.57 1.52 1.45
11 AM 1.57 1.49 1.32
12 PM 1.57 1.43 1.14
1 PM 1.57 1.32 1.00
2 PM 1.57 1.17 0.85
3 PM 1.57 0.97 0.63
4 PM 1.57 0.85 0.52
Tonight's low, mean absolute error (F) by local standard hour, test nights
HourEvening forecastSo-far ruleAdjusted
9 PM 1.70 1.61 1.54
11 PM 1.70 1.53 1.40
1 AM 1.70 1.45 1.18
3 AM 1.70 1.31 0.97
5 AM 1.70 1.12 0.72
L-023failed

The night restart: does restarting the night physics from the station's reading during the night improve the low? With the airports' observed clouds? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Brian asked for the night physics to use the clouds the ring airports actually report. The test design: run from sunset with the airports' reported low and mid cloud up to the restart time (or the forecast clouds, the control), restart the air from the station's reading, carry the cloud surprise forward (fading over 3 h), and blend with ours and the station's error now.

Why it might work

Exploration months (April 2 to July 15, 2026, real 12Z runs, 101 nights, cross-validated): station-error update C1 at 10 PM / midnight / 2 AM 1.40 / 1.31 / 1.12 F; + restarted physics with airport clouds C2 1.36 / 1.27 / 1.06; + restarted physics with forecast clouds C2f 1.36 / 1.25 / 1.04. The restart from the station helps; the airport clouds as substituted do not add (an airport's cover over one ceilometer is not the model grid box's cloud fraction the physics was tuned on).

The plan, written before the test

Frozen October 18, 2026 (physmodel/nightcloud.py, nightcloud_frozen.json fitted on all exploration nights). Night physics scmw (v1 + wet + snow) from sunset with the 12Z ECMWF + ICON runs; C2f: forecast clouds, air restarted at T from the station (dew point too; the grass keeps the run's gap); C2: the same with the ring airports' two lowest reported layers (low below 6,500 ft, mid to 12,000 ft, 1/distance weighted) up to T and the surprise fading after. C1 = ours + a + b e_s; C2/C2f add c (physics - ours); final = min(lowest so far, model). T = 10 PM, midnight, 2 AM. Nights: July 16 to October 11, 2026, excluding September 19 to 25.

Pass/fail bar: At MIDNIGHT, pass only if all hold: (1) C2f at least 0.04 F lower mean absolute error than C1; (2) C2f lower than ours; (3) the gain positive in at least 90% of 5,000 resamples of nights. C2 (airport clouds), 10 PM and 2 AM reported alongside. No verdict below 60 nights.
Results

77 held-back nights (July 16 to October 11, 2026). At midnight: ours 1.400 F, station-error update C1 1.269, restarted physics with forecast clouds C2f 1.201 (gain 0.068 F, 95% -0.04 to +0.18, positive in 88.4% of resamples), with the airports' clouds C2 1.208. Bars (1) and (2) met, (3) missed (90% needed): FAIL, narrowly. Alongside: 10 PM 1.53 / 1.42 / 1.34 F (91%), 2 AM 1.28 / 1.14 / 1.06 F (90%). The night restart helped at every time on months it never saw; the airports' reported clouds added nothing over the forecast's. The same narrow pattern as the afternoon update (L-021).

Held-back nights, the night's low, mean absolute error (F)
RestartOurs (6 PM)C1 station errorC2f restarted physicsC2 + airport cloudsShare positive (C2f)
10 PM 1.531 1.417 1.344 1.338 91.3%
Midnight 1.400 1.269 1.201 1.208 88.4%
2 AM 1.281 1.136 1.057 1.062 90.3%
L-022running (live from October 19, 2026)

Live trial of the midday sunshine update (follows L-021)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

L-021 found the midday physics restart with measured sunshine improved the afternoon high at 11 AM, noon and 1 PM on held-back months, but not consistently enough to call proven (86% of resamples at 1 PM). Does it hold on fresh days?

Why it might work

Brian asked to run it live and show it on the Physics page as 'Afternoon update (on trial)'.

The plan, written before the test

Frozen October 18, 2026: physlive.py midday() with phys_midday_frozen.json (= physmodel/sun_update2_frozen.json). Each day at 11 AM, noon and 1 PM local (computed within two hours after), from the forecasts the Tower had at sunrise: the L-020 day physics restarted with the station's measured sunshine (clientraw field 127) since sunrise and the last two hours' measured/forecast ratio carried forward (fading over 3 h); B1 = our sunrise-issue high + a + b x station error now; B2 adds c x (physics - ours); each final = max(the highest so far, the model). Logged in phys_runs (kind 'midday'). Days from October 19, 2026 with the update logged. Truth: the station's highest reading, sunrise to sunset.

Pass/fail bar: Evaluated once 100 days are logged at 1 PM (or on June 30, 2027 with whatever is there; no verdict below 60). At 1 PM, pass only if all hold: (1) B2 at least 0.05 F lower mean absolute error than B1; (2) B2 lower than our sunrise-issue high; (3) the gain over B1 positive in at least 90% of 5,000 resamples of days. 11 AM and noon reported alongside.
L-021failed

The midday sunshine update: does restarting the day physics with the sunshine actually measured so far improve the afternoon high? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Cloud surprises cost our forecasts on about half of days (R-010: much-darker-than-forecast days miss the high by 2.5 F). By midday the station's pyranometer knows how much sun actually came. Simply nudging our high by the morning's sunshine surprise did not help (correlation 0.09: morning clouds and afternoon clouds differ). Restarting the day physics with the measured sunshine so far, and scaling the afternoon forecast sunshine by the last two hours' measured/forecast ratio (fading over 3 hours), and blending it with ours and the station's current error: does that beat the station-error update alone?

Why it might work

Exploration months (April 2 to July 15, 2026, real 00Z runs, 100 days, cross-validated): at 1 PM ours 1.41 F, + station error (B1) 1.34 F, + restarted physics (B2) 1.20 F; at noon 1.45 / 1.48 / 1.40 F; at 11 AM no gain.

The plan, written before the test

Frozen October 18, 2026 (physmodel/sun_update2.py, sun_update2_frozen.json, fitted on all exploration days): at update time T (11, 12, 13 local), e_s = station temperature at T minus the 00Z ECMWF + ICON 2 m temperature at T; physics_T = the L-020 day physics (crop calendar, + 0.84 F) with the station's measured sunshine up to T and after T 0.907 x the forecast sunshine x (1 + (r - 1) x exp(-(t - T)/3 h)), r = measured/forecast over the last 2 hours (clipped 0.3 to 2). B1 = ours + a + b e_s; B2 = ours + a + b e_s + c (physics_T - ours); each final = max(the highest so far, the model). Days: July 16 to October 11, 2026 with the pyranometer covering the day, excluding September 19 to 25. Truth: the station's highest reading, sunrise to sunset.

Pass/fail bar: At 1 PM, pass only if all hold: (1) B2's mean absolute error at least 0.05 F lower than B1's; (2) B2 lower than ours; (3) the gain over B1 positive in at least 90% of 5,000 resamples of days. 11 AM and noon reported alongside. No verdict below 60 days.
Results

77 held-back days (July 16 to October 11, 2026). At 1 PM: ours 1.537 F, station-error update B1 1.438 F, + restarted physics B2 1.350 F; gain over B1 0.088 F (95% -0.08 to +0.26), positive in 86% of resamples: bars (1) and (2) met, (3) missed (90% needed): FAIL. Alongside: 11 AM 1.66 / 1.63 / 1.52 F (gain 0.11, 98% positive), noon 1.61 / 1.57 / 1.50 F (gain 0.07, 84%). The direction held at all three times on months it never saw; the evidence is not strong enough to call it proven. A live trial would add days.

Held-back days, the day's high, mean absolute error (F)
UpdateOurs (7 AM)B1 station errorB2 + restarted physicsGain B2 - B1Share positive
11 AM 1.660 1.629 1.521 0.108 97.8%
Noon 1.614 1.570 1.499 0.071 83.5%
1 PM 1.537 1.438 1.350 0.088 85.7%
L-020passed (in use for the Physics page's day high)

The day physics' cold bias: a crop calendar for evaporation, and an offset for real forecasts (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

With real forecast runs the day physics ran about 1 F too cold. Exploration (April 2 to July 15, 2026, real runs) split it: the forecast inputs (sunshine timing, morning upper air, air moving in) about 0.6 F, the model itself the rest; and the model's error is SEASONAL, the same every year (too cold in spring and fall, too warm in July-August and winter): the evaporation followed a smooth season peaking mid-July, while real fields here are bare in spring, a closed transpiring canopy in July-August, and drying in the fall. Do a sharper crop calendar plus an offset for real forecasts fix it on months never looked at?

Why it might work

Crop calendar (second seasonal harmonic of the evaporative fraction, refitted with ef_c and ef_s on discovery dry days with measured sunshine): discovery 1.28 -> 1.19 F, 2023 (never fitted) 1.59 -> 1.41 F, 2026 exploration with real runs 1.96 -> 1.83 F (bias -1.04 -> -0.84 F). Disclosure: the overall -1.1 F bias over all 178 test-year days (which include the test months below) was seen before this plan; the fix and the offset were fitted without the test months.

The plan, written before the test

Frozen October 18, 2026: physmodel/dayscm.py, params_day_v1_obs_adv2.json + params_day_season.json (ef_c 0.063, ef_s -0.021, ef_h2c 0.035, ef_h2s 0.006), sunshine 0.907 x the ECMWF + ICON forecast, advection v2, driven by the 00Z ECMWF + ICON runs, started at sunrise from the station (daybias.py); then + 0.84 F (day_offset.json: the mean bias on the exploration months). Compared with the L-010 version (same runs, no calendar, no offset). Days: July 16 to October 11, 2026, all days with the runs complete (wet and dry), excluding September 19 to 25. Reported alongside: both in a rule against ours refitted on the exploration months.

Pass/fail bar: Pass only if all hold: (1) physics alone at least 0.10 F lower mean absolute error than the L-010 version; (2) the size of the bias smaller; (3) the gain positive in at least 90% of 5,000 resamples of days. No verdict below 60 days.
Results

78 test-month days (July 16 to October 11, 2026, real 00Z runs, all days). Physics alone: L-010 version 1.786 F (bias -1.22), crop calendar + offset 1.591 F (bias -0.37); gain 0.194 F (95% -0.02 to 0.41), positive in 96.6% of resamples. All three bars met: PASS. The corrected physics alone now beats ours on these days (1.714 F). In a rule against ours (refitted on the exploration months) it adds nothing beyond the old one (1.61 vs 1.59 F): the old rule's intercept was already absorbing the bias. By month the bias went July -0.40 -> -0.28, August -1.84 -> -1.35, September -0.77 -> +0.53, October -1.61 -> +0.16 F: midsummer is still too cold.

Test-month highs, real runs, mean absolute error (F)
OursPhysics (L-010 version)Physics (calendar + offset)Rule oldRule new
1.714 1.786 1.591 1.589 1.610
L-019failed

The physics ensemble: does the night physics do better on three models' forcing (GFS + ECMWF + ICON) than on two? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

The night physics runs on the average of the ECMWF and ICON forecasts. On discovery nights (each model's stitched first hours), running it once per model and averaging the results did NOT beat averaging the forcing first (2.12 vs 2.08 F, 4 models), even when the models disagreed about low cloud; but adding GFS to the averaged forcing did help: ECMWF + ICON 2.141 F, + GFS 2.062 F, + GEM instead 2.182 F, all four 2.077 F (324 dry nights). GFS runs cold and ECMWF warm; together they cancel. Does that hold with real forecasts?

Why it might work

Brian asked for an ensemble; the useful part turned out to be which models go into the average, plus a confidence flag: the spread of the per-model lows was a modest warning (widest quarter of nights, about 7.5 F apart: 2.6 F misses, others about 1.95 F).

The plan, written before the test

Frozen October 18, 2026: physmodel/scmw.py with params_v1.json, params_wet.json, params_snow.json, started at sunset from the station as L-007. Forcing E2: the mean of the ECMWF and ICON 12Z runs (as live). Forcing G3: the mean of the GFS, ECMWF and ICON 12Z runs (GFS surface fields from the single-runs API, model gfs_global, fetched October 18 for this test; GFS upper air from the saved ncep_gfs025 runs). Ours: the walk-forward low, lead 1. Rules: ours + 0.25 x (physics - ours) with each. Nights: April 2 to October 11, 2026, dry (station 0.02 in or less), excluding September 19 to 25; nights where all three runs are complete. Reported alongside: the per-model physics lows, their spread against the size of the miss.

Pass/fail bar: Pass only if all hold: (1) the physics alone with G3 at least 0.05 F lower mean absolute error than with E2; (2) the rule with G3 no worse than the rule with E2; (3) the physics-alone gain positive in at least 90% of 5,000 resamples of nights. No verdict below 100 nights.
Results

148 dry test-year nights (real 12Z runs). Physics alone: ECMWF + ICON (E2, live) 1.785 F; + GFS (G3) 1.848 F; gain -0.062 F (95% -0.19 to +0.07), positive in 16% of resamples. Rule: 1.445 vs 1.455 F (ours 1.524). FAIL. GFS's help on the discovery years came from its first hours (near-analysis), not from its forecasts. The live forcing stays ECMWF + ICON. Per-model physics alone: GFS 2.43, ECMWF 2.18, ICON 1.86 F; the average beats every member. The spread of the three member lows is a modest warning: nights in the tighter half (spread under about 3 F) missed by 1.6 F, the wider half by about 1.95 F (correlation 0.24).

Dry test-year nights, low, mean absolute error (F)
OursPhysics E2 (live)Physics G3Rule E2Rule G3GFS aloneECMWF aloneICON alone
1.524 1.785 1.848 1.445 1.455 2.43 2.18 1.86
L-018failed

The calibration run: does the station's own recent days correct the ground's wetness for the day physics? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

The day physics takes the ground's wetness from a grid estimate of topsoil moisture (about 15 miles across). For each past day, the share of the sun's energy going into evaporation that best reproduces the station's actual warming curve (with the measured sunshine) says how wet the ground really behaved. Does a slow estimate from the previous two weeks improve today's high?

Why it might work

On 1,245 days with the pyranometer, a single day's inferred correction is mostly that day's own noise (correlation with the day before 0.13), but a two-week average holds a slow signal (0.23), and calm, clear days carry it best (0.30 from one quiet day to the next, half the noise). Discovery years, cross-validated: every block of months chose half the estimate (k = 0.5); physics alone 1.465 -> 1.417 F; in the L-010 rule against ours 1.404 -> 1.362 F (gain 0.042, 95% 0.022 to 0.062). Disclosure: the persistence statistics above were computed over all years, test year included; k and the method were chosen on discovery years only, and no test-year forecast has been scored.

The plan, written before the test

Frozen October 18, 2026 (physmodel/calib_run.py, calib_test.py, l018.py). Each day's inferred offset: the day physics (L-010 constants, advection v2) with the station's measured sunshine, offsets -0.45 to +0.45 in steps of 0.05 added to its evaporative fraction, scored on the 5-minute curve from sunrise to the observed high; days need the pyranometer for 90% of daylight. Today's estimate: the weighted mean of the previous 14 days' offsets (quiet days, cloud under 25%, 10 m wind under 4 m/s, 925 mb change under 1.5 K, weight 1; others 0.25; at least weight 2 in the window). Forecast: the L-010 day physics driven by the 00Z ECMWF + ICON runs (as l015.py), evaporative fraction + 0.5 x estimate. Rule C: ours + 0.30 + 0.54 x (calibrated physics - ours); rule U: the same with the usual physics. Days: April 2 to October 11, 2026, all days (wet and dry) with an estimate, excluding September 19 to 25, 2026.

Pass/fail bar: Pass only if all hold: (1) rule C's mean absolute error at least 0.02 F lower than rule U's; (2) the gain positive in at least 90% of 5,000 resamples of days; (3) at least 120 days.
Results

178 test-year days (April 2 to October 11, 2026, real 00Z runs). Rule U (usual physics) 1.526 F, rule C (calibrated) 1.531 F: gain -0.004 F (95% -0.03 to +0.02), positive in 37% of resamples. FAIL. With real forecasts, the day physics' errors come from the forecast sunshine and air mass; the ground's slow wetness signal (worth 0.04 F with near-perfect inputs) is lost under them. The grid's soil moisture stays as it is. By-product: the unchanged L-010 rule beat ours on all 178 days, 1.606 -> 1.526 F (dry and wet together); the live L-010 test decides that properly on fresh days.

Test-year highs, all days, mean absolute error (F)
OursPhysics (usual)Physics (calibrated)Rule URule C
1.606 1.886 1.889 1.526 1.531
L-017passed

Snow cover: does the night physics with snow insulation get snow nights right? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Version 1 of the night physics knows nothing about snow on the ground and ran +5.5 F too warm on last winter's nights with 2 inches or more. Snow conducts heat a fraction as well as soil, cutting the ground off from the soil's warmth, and a snow surface cannot warm past 32 F. With those added, is the physics right on a winter it never saw?

Why it might work

Learning winters (March 2023 to September 2025, 40 dry snow nights, only 3 with 5 cm or more), each winter scored with constants fitted on the other: without snow 2.69 F (bias +1.71 F), with snow 2.35 F (bias -0.36 F). Fitted on all 40: snow conductivity 0.118 W/m/K (the textbook range for settled snow), snow-surface heat capacity about 40,000 J/m2/K (the fit did not support a thin, fast-chilling surface).

The plan, written before the test

Frozen October 18, 2026: physmodel/scmw.py with params_v1.json, params_wet.json and params_snow.json (k_snow 0.1177, c_snow 39,676), full cover from 2 cm. Nights: the held-out winter, October 1, 2025 to April 30, 2026, dry (station 0.02 in or less and the models' precipitation under 0.02 in), with the models' snow depth 1 cm or more at sunset. Inputs: the stitched models' first hours and their snow depth (perfect prog: no real runs exist for that winter, so this checks the PHYSICS, not a forecast; the forecast test is live from this winter with Brian's snow reports). Compared: the same physics without snow cover. Truth: the station's lowest reading, sunset to sunrise.

Pass/fail bar: Pass only if all hold, on nights with the models' snow 5 cm or more: (1) mean absolute error at least 0.5 F lower with snow cover than without; (2) the size of the bias smaller; (3) the gain positive in at least 90% of 5,000 resamples of nights. No verdict with fewer than 15 such nights. All snow nights (1 cm or more) are reported alongside.
Results

Held-out winter 2025-26, 23 dry nights with the models' snow 5 cm or more: without snow cover 6.14 F (bias +5.79 F), with snow cover 4.53 F (bias +2.23 F); gain 1.61 F (95% 0.06 to 3.15), positive in 97.8% of resamples. All three bars met: PASS. All 43 snow nights: 4.59 -> 4.02 F, bias +2.62 -> +0.26 F. The snow physics is a large step, but deep-snow nights stay the hardest: the models' own low was 2.77 F on the same nights, and a warm bias of about 2 F remains (the learning winters had only 3 nights this deep, so deeper snow's insulation is likely underestimated). This winter's ground probes, under real snow, will measure it.

Held-out winter 2025-26, night low, mean absolute error (F)
NightsWithout snow coverWith snow coverModels' own low
Snow 5 cm or more (23) 6.14 (bias +5.79) 4.53 (bias +2.23) 2.77
All snow 1 cm or more (43) 4.59 (bias +2.62) 4.02 (bias +0.26) 2.12
L-016failed

Wet nights: does the night physics with wet-weather physics improve our low on rainy nights? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Version 1 of the night physics runs far too warm on rainy nights (+1.7 F on average, +4.1 F with a quarter inch or more, discovery). The new wet-weather physics fixes most of it. On rainy nights with real forecast runs, does the L-007 rule using it improve our low?

Why it might work

The main cause was physics, not tuning: version 1 brings the 925 mb air down to the ground along the DRY adiabat; in rain the air below the cloud is saturated and follows the MOIST adiabat, about 2.5 K (4.5 F) colder at the ground on heavy-rain nights. With that, plus rain cooling the air toward its wet-bulb and a wet lawn, on 130 discovery wet nights (cross-validated): physics 2.62 -> 1.99 F (bias +1.71 -> +0.49); heavy rain 4.08 -> 2.13 F. Against ours (1.57 F): the rule ours + 0.25 x (physics - ours) 1.52 F, the same as with version 1 overall, better with heavy rain (1.70 -> 1.55, 29 nights), worse on light-rain nights (1.40 -> 1.46).

The plan, written before the test

Frozen October 18, 2026: physmodel/scmw.py with params_v1.json (dry) and params_wet.json (k_ev 7.1e-5, e_p 0.85, w_full 4.2 mm, p_moist 0.15 mm/h; snow melting and freezing rain at their physical starting values), driven by the mean of the ECMWF and ICON 12Z runs and started at sunset from the station (physmodel/l016.py, as l007.py plus precipitation and the 850 mb air). Rule W: ours + 0.25 x (wet physics - ours). Reported alongside: rule V1 (version 1 physics in the same rule) and the runs' own 2 m low in the same rule (control). Ours: the walk-forward low, lead 1. Truth: the station's lowest reading, sunset to sunrise. Wet nights: more than 0.02 in at the station between sunset and sunrise. Test-year days April 2 to October 11, 2026 (the real-run archive), excluding September 19 to 25, 2026 (a rain-gauge glitch in the station archive).

Pass/fail bar: Pass only if all hold: (1) rule W's mean absolute error at least 0.05 F lower than ours; (2) lower than the control; (3) the gain over ours positive in at least 90% of 5,000 resamples of nights. No verdict with fewer than 30 wet nights.
Results

30 wet test-year nights (real 12Z runs). The wet-weather physics fixed the physics itself: version 1 2.79 F (bias +2.55 F), with wet physics 1.94 F (bias +0.66 F). But in the rule against ours it adds nothing: ours 1.38 F, rule W 1.38 F (gain -0.01, 95% -0.20 to +0.19), rule V1 1.42 F, control 1.42 F. Bars (1) and (3) missed: FAIL. On rainy nights our forecast is already good (the lows are set by the rain and the air mass, which the models carry); the physics now gets them about right but brings no new information.

Lows on wet nights, mean absolute error (F)
OursPhysics v1Physics + wetRule WRule V1Control
30 wet nights 1.38 2.79 1.94 1.38 1.42 1.42
L-015passed

Wet days: does the day physics, as it stands, improve our high on days with rain? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

The live day test (L-010) scores dry days only. On rainy days, does the same day physics, driven by real forecast runs, improve our high?

Why it might work

A wet-weather add-on for the day model (rain cooling toward the wet-bulb, wet ground) made highs WORSE on discovery wet days (bias -2.0 F): the model already sees rain days through the models' dark sunshine and the soil moisture, and the add-on counted the water twice. Without it, on 166 discovery wet days with the models' first-hours sunshine (which flatters it, since it already saw when the rain came): physics 1.62 F, ours 2.14 F, ours + a share of (physics - ours) 1.63 F. The fair version is real forecast runs.

The plan, written before the test

Frozen October 18, 2026, before any test-year wet day is looked at with this version: the L-010 day physics exactly (dayscm.py, params_day_v1_obs_adv2.json, advection v2, sunshine 0.907 x the ECMWF + ICON shortwave), driven by the 00Z ECMWF and ICON runs of that day (physmodel/l015.py), started at sunrise from the station. Rule: high = ours + 0.30 + 0.54 x (physics - ours) (the L-010 rule, unchanged). Control: ours + 0.85 + 0.50 x (the two runs' own 2 m high - ours). Ours: the walk-forward high, lead 1. Truth: the station's highest reading, sunrise to sunset. Wet days: more than 0.02 in at the station between sunrise and sunset. Test-year days April 2 to October 11, 2026 (the real-run archive), excluding September 19 to 25, 2026 (a rain-gauge glitch in the station archive).

Pass/fail bar: Pass only if all hold: (1) mean absolute error at least 0.05 F lower than ours; (2) lower than the control; (3) the gain over ours positive in at least 90% of 5,000 resamples of days. No verdict with fewer than 30 wet days.
Results

43 wet test-year days (April 2 to October 11, 2026, real 00Z runs). Ours 2.08 F, physics alone 2.06 F, rule 1.74 F, control 2.04 F. Gain over ours 0.33 F (95% 0.10 to 0.58), positive in 99.7% of 5,000 resamples. All three bars met: PASS. Every month improved (April to September). The day physics, unchanged, is worth more on rainy days than on dry ones: our forecast misses rain-day highs by more, and the physics, started from the station at sunrise and fed the runs' dark sunshine, catches much of it.

Highs on wet days, mean absolute error (F)
OursPhysics aloneRuleControl (runs' own high)
43 wet days 2.08 2.06 1.74 2.04
L-014failed

Do the small effects add up? The inversion at 6 PM on top of the night physics rule (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Brian's question: many tested effects were each worth only about 0.02 F and were set aside. Added together, do they become something big? On discovery days (lead 1, cross-validated by 6 blocks of months), every small candidate was combined with our forecast in one penalised regression. The only small effect that survived on top of the night physics was the inversion strength at 6 PM (925 mb minus 2 m temperature). Does it improve the L-007 rule on real-run nights?

Why it might work

Discovery, 225 lows and 232 highs with every candidate: ours 1.71 F (lows), 1.70 F (highs). Lows: physics alone gains 0.10 F; all five small effects together (the other forecast program, inversion, soil moisture, ring error, upwind error) gain 0.06 F, nearly all from the inversion; physics + inversion 0.125 F; all six 0.11 to 0.12 F. Highs: all five small effects together LOSE 0.06 F; physics alone gains 0.23 F and adding the rest only takes away. The small effects mostly overlap with each other or do not carry 12 to 30 hours ahead (the ring and upwind errors help 1 to 6 hours ahead, L-013, not the next day).

The plan, written before the test

Frozen October 18, 2026, before looking at the inversion on any test night. Rule P = the L-007 rule: ours + 0.25 x (physics - ours). Rule P+I = rule P + 1.716 + 0.1852 x inv, where inv = 925 mb temperature minus 2 m temperature (F) at 22Z (6 PM EDT) in the mean of the ECMWF and ICON 12Z real runs; the two numbers fitted on all 472 discovery nights (residual of rule P, perfect-prog physics). Nights: the L-007 real-run nights (April 2 to October 11, 2026, dry, 149 nights), then fresh nights from October 19, 2026 logged by the Tower.

Pass/fail bar: Pass only if both hold on the test nights: (1) P+I's mean absolute error at least 0.02 F lower than P's; (2) the gain positive in at least 80% of 5,000 resamples of nights. Expected gain from discovery is small (about 0.02 F), so a no-pass is the likely outcome; the test is underpowered and is reported either way.
Results

149 real-run test nights (April 2 to October 11, 2026). Ours 1.52 F, physics rule P 1.38 F, P + inversion 1.37 F. Gain 0.014 F (95% -0.03 to 0.06), positive in 72% of resamples. Neither bar met: FAIL. The size is what discovery predicted (about 0.02 F); it is real-looking but too small to prove or to be worth the complication. Answer to the question: the small effects do not add up to something big here. They overlap, and most of them belong to the next few hours rather than the next day.

Lows, mean absolute error (F)
SetDiscovery (CV, 225 nights)Test (149 real-run nights)
Ours 1.71 1.52
+ physics 1.61 1.38 (rule P)
+ physics + inversion 1.59 1.37
+ all five small effects, no physics 1.65 not tested
L-012running (live fog log from October 19, 2026)

Fog: does our night physics add to the models' own humidity forecast? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Made at sunset each night: the models' forecast of how close the 2 m air comes to its dew point overnight, and the same from our night physics with its moisture budget (version 3). Does adding the physics improve the ranking of fog nights over the models alone, on fresh fall-to-spring nights?

Why it might work

On discovery nights the physics was a weak fog signal (ranking skill 0.67 regional, 0.73 station saturation, version 3) against the models' near-analysis humidity (0.90), but that comparison flatters the models (their first hours have already seen the night). The fair rival is the models' FORECAST humidity at sunset, which the Tower logs from October 18.

The plan, written before the test

Frozen October 18, 2026 (physlive.py fog_signals and integrate_v3; phys_params_v3.json = physmodel/params_v3b.json). Each night the Tower's sunset run logs: models_min_dd = the smallest 2 m temperature minus dew point overnight in the ECMWF + ICON forecast (F); v3_min_dd = the same from the night physics version 3 started at the station's sunset reading. Score M = -models_min_dd; score C = the average of the two scores' ranks (no fitted weights). Truths: regional fog = visibility under 1 mile at Marion or Huntington between sunset and sunrise (airport archive, research_data.py asos); station saturation = the station's humidity at 97% or more for 3 hours or more. Nights: October 19, 2026 to April 30, 2027, dry (0.02 in or less).

Pass/fail bar: Ranking skill (AUC). Pass only if C beats M by at least 0.02 on BOTH truths. Valid only with at least 20 regional-fog nights (otherwise report, no verdict). Fog outcomes on fresh nights are not looked at before the evaluation.
L-010running (live from October 19, 2026)

Our day physics with the models' sunshine, on fresh days (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

After L-009 failed on its cloud-to-sunshine step: with the sunshine taken from the models' own radiation forecasts (calibrated against the station's sensor), does the day physics improve the high we issue at sunrise, on days that did not exist when this was written?

Why it might work

On L-009's days the physics driven by MEASURED sunshine matched our high (1.48 vs 1.46 F), so the physics holds up and the sunshine input failed. The models' own radiation forecasts beat our cloud dimming against the sensor (clearness error 0.097 vs 0.136). On discovery days, the physics fitted on measured sunshine and driven by 0.907 x the models' sunshine, cross-validated: physics alone 1.63 F (ours 1.68), gain over ours + sunrise information 0.10 F (95% -0.01 to 0.21). Those April to October days are not reused.

The plan, written before the test

Frozen October 18, 2026: physmodel/dayscm.py; constants params_day_v1_obs_adv2.json (fitted on discovery days with measured sunshine, advection v2: 925 mb 0.71, 850 mb 0.02, 2 m 0.14); sunshine = 0.907 x the mean of the ECMWF and ICON shortwave forecasts in the Tower's newest snapshot; advection v2 with the discovery-year daily-cycle composites (phys_composite.json); start: the station's reading at sunrise; profile, clouds, wind, snow and ECMWF topsoil moisture from the newest snapshots. Logged once per day by the Tower (phys_runs kind 'day'), with our high as issued at that hour and the two models' own 2 m high. Rule: high = ours + 0.30 + 0.54 x (physics - ours). Control: ours + 0.85 + 0.50 x (the models' 2 m high - ours). Truth: the station's highest reading, sunrise to sunset. Dry days only (0.02 in or less of rain at the station, sunrise to sunset). Days from October 19, 2026.

Pass/fail bar: Evaluated once 120 dry days are logged (or on June 30, 2027 with whatever is there, no verdict below 120). Pass only if all hold: (1) mean absolute error at least 0.05 F lower than ours; (2) lower than the control; (3) the gain over ours positive in at least 90% of 5,000 bootstrap resamples.
L-008running (live on fresh dry nights)

Our night physics, live: does it improve the low we issue at sunset? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

On nights after October 18, 2026, run live on the Tower: does L-007's rule (ours + 0.25 x (physics - ours)) beat the low our forecast had issued at the same hour?

Why it might work

L-007 passed against our day-ahead low on April to October nights. Live, the physics starts at sunset from the station and our forecast is refreshed hourly with the newest runs, a tougher rival, and the season turns to winter.

The plan, written before the test

Frozen: physlive.py as deployed October 18, 2026 (phys_params.json = physmodel/params_v1.json). Each night the Tower logs, in table phys_runs (kind 'sunset'), the physics low from the station's sunset reading and our forecast low at that hour (the newest issue). Rule: ours + 0.25 x (physics - ours). Truth: the station's lowest reading, sunset to sunrise. Dry nights only (0.02 in or less of rain at the station). Our live-adjusted low on Today's Track is reported alongside, no bar.

Pass/fail bar: Evaluated once 120 dry nights are logged (or on June 30, 2027 with whatever is there, no verdict below 120). Pass only if: (1) mean absolute error at least 0.05 F lower than ours; (2) the gain positive in at least 90% of 5,000 bootstrap resamples.
L-009failed

Does our own day physics improve the day's high? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Our day physics model (version 1.1 with advection version 2), started at sunrise from the station's own reading and driven by real forecast runs: does a fixed share of it make our high more accurate on days it has never seen, and is any gain more than just having a fresher model run?

Why it might work

On discovery days (March 2024 to September 2025), with near-analysis inputs, the cross-validated day physics added 0.14 F to our high beyond the same sunrise information used statistically (95% interval 0.03 to 0.25 F), once advection was handled as the weather part of the models' 925 mb, 850 mb and 2 m change (the typical daily cycle removed). Near-analysis inputs flatter the physics; the honest test needs forecast inputs.

The plan, written before the test

Frozen before scoring (hyperlocal/physmodel/: dayscm.py, params_day_v1_adv2.json fitted on discovery days only; days.py with the daily-cycle composites from the discovery years). Days: sunrises April 2 to October 11, 2026, dry (0.02 in or less of rain from sunrise to sunset), with both models' 00Z run of that date (out before sunrise) and station data. Forcing: the mean of the ECMWF and ICON 00Z runs (clouds low, mid and high through our cloud dimming, 10 m wind, the 925/850/700 mb profile at sunrise, the weather part of the 925 mb, 850 mb and 2 m change, snow depth); start: the station's 5-minute reading at sunrise; topsoil moisture and deep soil: ERA5 at sunrise. Physics high = its maximum, sunrise to sunset. Ours = our walk-forward day-1 high. Rule (fixed on discovery): high = ours + 0.41 + 0.50 x (physics - ours). Control (fresher run, no physics): ours + 0.85 + 0.50 x (the two 00Z runs' own 2 m high - ours), its constant fitted on discovery the same way. Truth: the station's highest 5-minute reading, sunrise to sunset.

Pass/fail bar: Pass only if all hold: (1) mean absolute error at least 0.05 F lower than ours; (2) lower than the control; (3) the gain over ours positive in at least 90% of 5,000 bootstrap resamples of days. Sunny and cloudier days reported separately, no bar. Fewer than 120 days: report, no verdict.
Results

135 dry days scored (185 built), April 2 to October 11, 2026. Our day-1 high missed by 1.46 F; the frozen rule (ours + 0.41 + 0.50 x (physics - ours)) by 1.55 F, worse, positive in only 13% of resamples. The control, the fresh 00Z runs' own 2 m high, improved ours to 1.35 F. The physics alone missed by 2.08 F with a -1.23 F bias (cloudier days 2.65 F). No bar met: FAIL.

Day high, mean absolute error (F), 135 dry days
ForecastAllSunny (77)Cloudier (58)
Ours (day 1) 1.46 1.37 1.57
Ours + 0.41 + 0.50 x (physics - ours) 1.55 1.38 1.78
Control: fresh 00Z runs' 2 m high 1.35 1.26 1.47
Physics alone 2.08 1.66 2.65
What it means

Failed, and the diagnostic shows why: on the same 135 days with the same runs, the same physics driven by the sunshine the station's sensor actually MEASURED missed the high by 1.48 F (bias -0.59), level with ours. So the physics core and the new advection hold up on real forecasts; the cloud-to-sunshine step (our dimming of the runs' low/mid/high cloud) is what failed. It gets the total right on average (96% of measured) but misses individual cloudy days badly. The models' own sunshine forecasts are better (sensor comparison, R-010). Also notable: the fresh 00Z runs alone improve our day-1 high by 0.1 F, a reminder that a fresher run is real information.

Next

Rebuild the day model's sunshine on the models' own radiation forecasts (calibrated against the sensor), explore on discovery days only, then test on FRESH days (October 18, 2026 on, from the live log), not again on these April to October days.

L-007passed (the night blend shown on the Physics page; live check L-008)

Does our own physics model improve tonight's low? (research R-010)

opened October 18, 2026 · by the Claude, with Brian, in a session
The question

Our physics model of the night (version 1), started at sunset from the station's own readings and driven by real forecast runs: does a fixed share of it make our low forecast more accurate on nights it has never seen, and is any gain more than just having a fresher model run?

Why it might work

On discovery nights (March 2024 to September 2025), with near-analysis inputs, adding the cross-validated physics low to our day-ahead low cut the error from 1.63 to 1.56 F, while the same sunset readings used statistically added nothing (1.66 F); gain 0.11 F, 95% interval 0.05 to 0.17 F. Near-analysis inputs flatter the physics, so the honest test needs forecast inputs, which the real-run archive (ECMWF and ICON since April 2, 2026) provides.

The plan, written before the test

Frozen before scoring (hyperlocal/physmodel/: scm.py version 1, params_v1.json fitted on discovery nights only on October 18). Nights: sunsets April 2 to October 11, 2026, dry (0.02 in or less of rain between sunset and sunrise), with both models' 12Z run of that date and station data. Physics forcing: the mean of the ECMWF and ICON 12Z runs (clouds low, mid and high, 10 m wind, 925 mb temperature and height brought down dry-adiabatically, the change in 2 m dew point); start: the station's 5-minute reading at sunset; deep soil: ERA5 7-28 cm at sunset. Physics low = its minimum, sunset to sunrise. Ours = our walk-forward day-1 low (trained only on earlier days). Rule (fixed on discovery): low = ours + 0.25 x (physics - ours). Control (same rule, fresher run, no physics): ours + 0.25 x (the two 12Z runs' own 2 m low - ours). Truth: the station's lowest 5-minute reading, sunset to sunrise.

Pass/fail bar: Pass only if all hold: (1) mean absolute error at least 0.05 F lower than ours; (2) lower than the control; (3) the gain over ours positive in at least 90% of 5,000 bootstrap resamples of nights. Clear and calm nights reported separately, no bar. Fewer than 120 nights: report, no verdict.
Results

149 dry nights scored (187 built; nights with rain or missing data dropped as planned), April 2 to October 11, 2026. Our day-1 low missed by 1.52 F on average; the frozen rule (ours plus a quarter of the physics difference) missed by 1.38 F, a 0.14 F (9%) gain, positive in 99.9% of resamples (95% interval 0.05 to 0.23 F). The control, the same rule using the two fresh 12Z runs' own 2 m low instead of physics, did not help (1.54 F): the gain is the physics, not just a fresher run. The physics alone missed by 1.80 F, against 2.40 F for the runs' own 2 m low. All three bars met: PASS.

Night low, mean absolute error (F), 149 dry nights
ForecastAll nightsClear and calm (69)Bias
Ours (day 1) 1.52 1.18 -0.41
Ours + 0.25 x (physics - ours) 1.38 1.15 -0.14
Control: ours + 0.25 x (12Z runs' 2 m low - ours) 1.54 1.37 -
Physics alone 1.80 1.70 +0.66
The 12Z runs' own 2 m low 2.40 - +1.85
By month (mean absolute error, F)
MonthNightsOursRule
April 21 1.82 1.68
May 26 1.24 1.13
June 23 1.77 1.47
July 25 1.34 1.24
August 23 1.50 1.46
September 21 1.43 1.24
October 10 1.72 1.65
What it means

Our own physics adds real information to tonight's low, on nights it never saw and with real forecast inputs. Not a bias effect: with our bias removed in hindsight the rule still gains (1.49 to 1.37 F), and it gained in every month. Limits: warm season only (no winter nights yet); the physics starts from the sunset reading while our day-1 low was issued the day before, so part of the gain may be that fresh reading (the same reading used statistically added nothing on discovery nights); deep soil came from ERA5. Nothing changes in the live forecast yet.

Next

Run the physics live on the Tower every evening and log its low (October 18 on). L-008, to pre-register: against our live-adjusted low at sunset (the real competitor, which already uses the evening readings), on fresh nights through winter, before any blend goes into the forecast.

C-001case study, scored

The October 17 Freeze Warning night: what we said, and how it went (the low was 31.5 F; our forecast 31.5 F)

opened October 17, 2026 · by the lab assistant on the Tower
The question

The NWS issued a Freeze Warning for the night ending the morning of October 17, 2026. How did our low forecast evolve over the four days, how did it compare with the NWS, the four-model average and WxSim, and what is the station doing? This session ran at about 2:20 AM local, before the low happened, so the final result is not known yet.

Why it might work

Freeze nights are the ones that matter most to a gardener. Research thread R-007 found a slight warm tendency near freezing; this is a live example to compare against.

The plan, written before the test

Read the forecast trail in hyperlocal.db (issued table, night_min for Oct 17 and Oct 18) and the station readings through 2:20 AM. No scoring: the night is not over. A follow-up scoring on the finished night is left to the next session.

Pass/fail bar: Case study: no pass/fail. Findings become ideas for proper tests on other days.
Results

Our forecast low for the night held between 31 and 34 F for four days and ended at 31.1 to 31.2 F (plus or minus about 3.1 F). The NWS said 33 F four days out, 32 F two days out and 31 F the afternoon before. The four-model average was 2 to 3 F warmer than ours throughout (33.9 to 34.0 F at the last issue), and WxSim wandered between 30.4 and 36.5 F (33.5 F at its last run I saw). So we sat with the NWS, below the raw models. At 2:20 AM the station read 43.0 F with a dew point of 39.0 F, wind 1.5 to 2.9 mph and falling about 1.2 F per hour. That pace would bring it to roughly 36 to 38 F by sunrise, well above 31 F, unless cooling speeds up. The dew point is also falling about 0.7 F per hour. SCORED October 18: the night was the one ending the morning of October 18 (the text above called it the night ending October 17, a slip). The station's low was 31.5 F. Our final forecast 31.5 F, the NWS 31 F, WxSim 29.5 F, the four-model average 34.2 F. At 2 AM the cooling pace had pointed above 31 F; the night finished on our forecast. Frost was on the grass and the roof at dawn (Brian).

Forecast low for the night of Oct 16 to 17, by issue time (local)
IssuedOurs (+/-)Four-model avgNWSWxSim
Oct 14 5 PM (4 days out) 33.2 (4.1) 34.8 33 -
Oct 15 9 PM (about 2.5 days out) 31.9 (4.7) 34.1 - 34.6
Oct 16 2 PM 31.3 (4.0) 33.3 31 30.4
Oct 16 6 PM 32.0 (3.3) 34.0 - 32.5
Oct 17 2 AM 31.2 (3.1) 34.0 - -
Station readings overnight (local)
TimeTemp FDew point FWind mph
Oct 16 6 PM 51.3 49.3 7.9
Oct 16 10 PM 48.6 44.4 4.1
Oct 17 12 AM 46.0 41.4 6.6
Oct 17 2 AM 43.5 39.4 2.5
  • Not scored: the night's low had not happened when this was written. Our low for the following night (Oct 18) is 36.3 F, which is above the frost-free line of 36 F only barely; the models are 2 F warmer.
What it means

Preliminary. Our forecast correction pulled the cold side of the raw models by 2 to 3 F, in agreement with the NWS. Whether that was right depends on the final low. The cooling pace at 2 AM suggests we may have been too cold, which would fit the warm tendency near freezing that R-007 found, but this is a guess from half a night and proves nothing.

Next

Next session: read the finished low for Oct 17 (tmin_day_f in the obs table after sunrise) and the Oct 18 night, and append the error to this entry and to R-007. If we were warm-missed again, that adds one night to the fresh-month evidence for R-007 idea 4 (tested only on October 2026 onward). No change to the forecast is suggested by one night.

L-006running (collecting forecasts to March 31, 2027)

Does WxSim's forecast improve our highs and lows? (research R-009)

opened October 17, 2026 · by the Claude, with Brian, in a session
The question

Blending a small, fixed share of WxSim's forecast into ours: does it make our day 1-2 highs and lows more accurate, on months nobody has looked at?

Why it might work

WxSim is a physics model of the column over the station, a different approach from the global models we correct, and its mistakes overlap ours only partly (error correlation 0.36 to 0.52 on the discovery years). On those years, WxSim's own information was worth about 0.01 to 0.02 F where it helped (day-2 highs, lows days 1-3) and slightly hurt next-day highs. Small, but WxSim now runs reliably for the first time, so a clean test on fresh months is possible.

The plan, written before the test

Frozen method (hyperlocal/research/wxsim_input_test.py and wxsim_frozen.json as of today): our forecast + b x (WxSim - our forecast), no extra bias term, b fitted on discovery days: highs 0.109 (day 1) and 0.176 (day 2), lows 0.074 and 0.084. WxSim value = the newest WxSim run finished by our issue time (7 AM for highs, 6 PM for lows; at most 12 hours old), its max over our day window or min over our night window. The test year was deliberately NOT used: WxSim ran on only about 70 of its days, too few to detect an effect this size. Fresh issues: October 17, 2026 to March 31, 2027, run once our walk-forward forecasts cover them. Brian keeps WxSim's settings unchanged in this window (any change is logged with its date).

Pass/fail bar: Valid only with at least 300 forecasts that have a WxSim value (otherwise extend to June 30, 2027). Pass only if all hold, days 1-2 highs and lows combined: (1) mean error at least 0.02 F lower; (2) gain positive in at least 90% of resamples by day; (3) neither highs nor lows more than 0.01 F worse on their own.
L-005running (collecting fresh months to January 31, 2027)

Confirming the hour-by-hour forecast on fresh months (follow-up to L-003)

opened October 17, 2026 · by the Claude, with Brian, in a session
The question

Does the hour-by-hour correction that just missed its bar in L-003 (9.6% better than the strip against a 10% bar, better every month) hold up on months nobody has looked at?

Why it might work

L-003 showed a steady gain but used the test year, which many experiments have now seen. A pass on fresh months is the honest way to decide; the bar is set now, before any of those months exist.

The plan, written before the test

Exactly the frozen L-003 method (hyperlocal/research/r008_hourly.py, only the dates changed): 6 PM issues, next 48 hours, compared with the strip and the raw blend on identical hours. Fresh issues: October 17, 2026 to January 31, 2027. Run by the lab once the training data covers January 2027.

Pass/fail bar: Pass only if all three hold: (1) hours 1-24 at least 5% lower error than the strip; (2) hours 25-48 lower than the strip; (3) hours 1-24 better than the strip in each full month (November, December, January). If it passes, promotion still needs Brian and Claude to agree, and the hourly path reconciled with our daily high and low.
L-004complete, not promoted

Do the models' forecast inversions correct our lows? (research R-003, R-002)

opened October 17, 2026 · closed October 17, 2026 · by the Claude, with Brian, in a session
The question

When the forecast shows warm air sitting over cold air near the ground overnight (an inversion), does a correction learned from that inversion make our day 1-2 lows more accurate, using real forecasts available at issue time?

Why it might work

Our lows bust mostly on nights that go calm and stable at the ground (R-002). With hindsight upper-air data, the inversion strength lined up with our miss steadily: strong inversion nights ended 0.6-0.9 F colder than forecast, nights with none 0.45 F warmer (R-003). Operational models are known to mix stable night air too much (Sandu et al. 2013). The real question is whether the FORECAST inversion, known at 6 PM, carries that signal.

The plan, written before the test

Frozen method: hyperlocal/research/r003_inversion_test.py as of today. Features per night (11 PM to 5 AM local), mean of ECMWF and ICON: inversion = 925 mb minus 2 m temperature (F), and 925 mb wind (mph). The correction (one small ridge regression per lead) is learned only on the discovery nights (March 2024 to September 2025) from near-analysis upper air, already fitted: lead 1 -0.25 F and lead 2 -0.63 F per 4.4 F of inversion, +0.07 and +0.09 F per 12 mph of 925 mb wind. Applied unchanged to the real model runs: the 00Z run of the issue day, available long before the 6 PM issue. Test: our walk-forward lows (leads 1-2) for issue days April 2 to September 30, 2026 (test-year months, never used with these inputs; the runs start April 2). Confirmation, a separate later run: issue days October 17, 2026 to March 31, 2027, same frozen correction, same bar.

Pass/fail bar: Pass only if all three hold: (1) lows days 1-2 combined, mean error at least 0.02 F lower with the correction; (2) resampling nights, the gain is positive in at least 90% of resamples; (3) physics check: on nights with a forecast inversion of 6 F or more (3 F if fewer than 20 such nights), the correction lowers the forecast on average and lowers the error there. Promotion also needs the same three on the winter confirmation months.
Results

177 nights (348 forecasts, leads 1-2), issue days April 2 to September 30, 2026, real ECMWF and ICON runs. The correction moved the right way but too little: 0.013 F better overall (bar 0.02), positive in 74% of resamples (bar 90%). The physics check passed: on the 72 forecasts with a forecast inversion of 3 F or more, the correction lowered the low by 0.42 F on average and cut the error from 1.181 to 1.170 F. Fewer than 20 forecasts reached 6 F, so the 3 F threshold applied, as pre-registered.

Mean error of our lows, test months (F)
ForecastNightsOursWith the inversion correction
Day 1 172 1.406° 1.375°
Day 2 176 1.673° 1.677°
Days 1-2 348 1.541° 1.528°
  • Bar 1 (at least 0.02 F better): 0.013. FAIL.
  • Bar 2 (positive in 90% of resamples): 74%, 90% interval -0.021 to +0.047 F. FAIL.
  • Bar 3 (strong-inversion nights lowered and improved): -0.42 F, 1.181 to 1.170 F. Pass.
  • Day 1 improved 0.031 F; day 2 got 0.005 F worse. Noted, not acted on: picking day 1 alone after seeing this would be a forking path.
  • These are spring and summer months; strong inversions are a winter phenomenon, and only 72 forecasts had one of 3 F or more.
What it means

The signal is real in direction and physics (strong-inversion nights do end colder, and the correction knows it), but in spring and summer it is too small to clear the bar. Not passed, not promoted.

Next

The pre-registered winter confirmation (issue days October 17, 2026 to March 31, 2027) still runs with the same frozen correction: winter is when inversions are strongest, so it is the fair season to look. Because this test failed, a winter pass cannot promote this version by itself; it would justify a new pre-registered version, tested on further fresh months.

L-003complete, not promoted

Our own hour-by-hour temperature forecast for the next 48 hours (research R-008)

opened October 16, 2026 · closed October 16, 2026 · by the Claude, with Brian, in a session
The question

Can a station-corrected hourly temperature forecast beat what the Weather Briefing's 24-hour strip shows today (the model blend, shifted by our high/low correction for windows starting within 30 hours)?

Why it might work

The models have station habits by hour (how fast evenings cool, when the afternoon peaks) that a daily correction can't fix, and the station's own reading at issue time says how far off the blend is right now. The NWS does this operationally (LAMP, hourly National Blend). Exploring on the discovery years (March 2024 to September 2025) the correction scored 1.73 F per hour over the first 24 hours against 1.97 F for the strip and 1.89 F for the raw blend.

The plan, written before the test

Frozen method: hyperlocal/research/r008_hourly.py as of today. Issue at 6 PM EDT (22Z) each day; targets every hour for the next 48 hours; truth = the station's temperature within 5 minutes of each hour. Only information available at issue: model hours from runs at least 24 h (hours 1-24) or 48 h (hours 25-48) older than the target hour, so always before the issue time; our walk-forward daily forecasts; the station reading at issue. Method: the 4-model blend plus a ridge correction (one per lead hour) on our daily correction for the hour's window, the blend's error at issue, model spread, cloud, wind, dew point, each model's temperature, time of day and season. Walk-forward by issue month with an 8-day gap, training on everything before (discovery years included). Test issues October 1, 2025 to October 9, 2026, compared on identical hours with (a) the strip as the page builds it and (b) the raw blend.

Pass/fail bar: Pass only if all three hold on the test year: (1) mean hourly error over hours 1-24 at least 10% lower than the strip; (2) lower than the strip over hours 25-48; (3) lower than the strip over hours 1-24 in at least 9 of the 12 test months. Then confirm on fresh months (October 2026 on) before promotion. Note: if promoted, the hourly path must be reconciled with our daily high and low so the page never shows two different answers.
Results

Test year, 358 issues (October 1, 2025 to October 9, 2026), 16,938 hourly targets. The hourly correction was better than the strip every month, but over hours 1-24 it was 9.57% better, just short of the 10% bar. Criterion 1 fails; 2 and 3 pass. By the rules this does not pass.

Mean hourly temperature error, test year (F)
Hours aheadRaw blendToday's stripHourly correction
1-24 2.003° 1.946° 1.759°
25-48 2.380° 2.326° 2.196°
By month, hours 1-24 (F)
MonthToday's stripHourly correction
2025-10 1.823° 1.650°
2025-11 1.827° 1.673°
2025-12 1.824° 1.641°
2026-01 1.953° 1.759°
2026-02 2.404° 2.196°
2026-03 2.001° 1.767°
2026-04 2.224° 1.952°
2026-05 1.894° 1.666°
2026-06 1.858° 1.701°
2026-07 1.802° 1.592°
2026-08 1.824° 1.757°
2026-09 1.927° 1.725°
2026-10 1.968° 1.925°
  • Criterion 1 (hours 1-24 at least 10% lower than the strip): 9.57% lower. FAIL.
  • Criterion 2 (hours 25-48 lower than the strip): 2.196 vs 2.326. Pass.
  • Criterion 3 (better in at least 9 of 12 months): better in 13 of 13. Pass.
  • Resampling issue days: improvement 90% interval 7.7% to 11.4%; 37% of resamples reach 10%. The gain is real and steady; its size sits right at the bar.
  • Where it comes from: hours 1-6 21% better (the station reading at issue), hours 7-24 5% better. Every season better.
  • Conservative setup: model hours came from runs at least 24 h older than the target hour; the live system has fresher runs.
  • The discovery side finding (strip worse than the raw blend) did not hold on the test year: strip 1.946, raw blend 2.003.
What it means

A real, steady improvement (every month, every season, strongest in the first six hours), but smaller than the 10% we asked for in advance. It does not pass. The bar does not move after the fact.

Next

Proposed for Brian and Claude to decide: a confirmation test of the same frozen method on fresh months (October 2026 on), with a new bar written before those months are seen. Separately, improvements may be explored on the discovery years only (fresher model runs as the live system has them, a smoother treatment of lead hours), never tuned on the test year.

L-001complete, not promoted

Does the NWS blend (NBM) or the wind direction sharpen our highs and lows?

opened October 16, 2026 · closed October 16, 2026
The question

Our temperature correction knows wind speed but not wind direction, and it has never been offered the National Blend of Models (NBM), the NWS's own calibrated forecast. Do either of them help?

Why it might work

Wind direction carries air from somewhere else: an overnight south wind brings warmer, moister air and holds the low up, a northwest wind does the opposite (advection). NBM is already bias-corrected by NWS against thousands of stations, so where it disagrees with the raw models it may know something.

The plan, written before the test

Add to the current temperature model, one variant at a time: (A) NBM minus the models' average, with a flag when NBM is missing (it starts Oct 2024); (B) the four models' average wind components during the period, east-west and north-south; (C) both. Same walk-forward test as everything else, test period Oct 1 2025 onward, days 1-3 ahead (archived wind direction only goes 3 days out).

Pass/fail bar: Keep a variant only if it cuts the average error for days 1-2 by at least 0.05 degrees for highs or for lows, and makes no day 1-3 worse by more than 0.03 degrees. This is the same bar the forecast discussions faced.
Results

Average error (degrees F) on days the model never saw, Oct 2025 to Oct 2026.

Highs
VariantDay 1Day 2Day 3Days 1-2
Today's model 1.574° 1.971° 2.400° 1.774°
A: + NBM 1.576° 1.979° 2.408° 1.778°
B: + wind direction 1.569° 1.974° 2.366° 1.773°
C: + both 1.570° 1.982° 2.378° 1.777°
Lows
VariantDay 1Day 2Day 3Days 1-2
Today's model 1.697° 2.034° 2.304° 1.867°
A: + NBM 1.699° 2.039° 2.300° 1.870°
B: + wind direction 1.652° 2.022° 2.288° 1.838°
C: + both 1.652° 2.024° 2.282° 1.839°
  • Wind direction for lows, days 1-2: 0.028 degrees better; resampling the test days 2,000 times puts it between 0.004 and 0.051, and better in 98% of resamples. Real, but small.
  • Where it helps: nights with a northerly wind 0.075 better (138 nights), light winds 0.035 better (310), southerly winds no change (264).
  • By month it is noisy (from 0.06 worse in June to 0.13 better in October), as expected for an effect this small.
What it means

Neither idea clears the bar, so nothing changes in the forecast. NBM adds nothing to highs or lows: our own station correction already does what NBM's calibration does, for this spot. Wind direction is a real but small help to lows, and it lives almost entirely on northerly-wind nights, when cold air flows in behind a front. That fits the physics: those are nights when the air mass itself is changing, which a correction built around clouds and calm can't see.

Next

Follow the signal where it lives: test northerly flow together with clear skies (a clear night behind a front is both cold-air flow and radiational cooling). But this test year has now been looked at, so a sharper version tested on it again would flatter itself. The honest move is to confirm it on months nobody has looked at yet: re-run in the January 2027 lab session on Oct-Dec 2026 alone, with the bar written down now.

Lab log

One line for every lab session, including the ones where nothing was worth testing.

Ideas waiting their turn