Go/no-go guidance for upcoming weekday training sessions, on the same
Monte-Carlo engine as the weekend call but with its own thresholds
(training_rules.json). Tap a day for the detail. The call at a
glance is the chip — for the age group selected above; coaches should still
eyeball the ground before committing on a marginal afternoon.
Each simulated trial runs top to bottom; the first rule whose condition
holds sets the call, otherwise it's GREEN. Generated live from
policy_rules.json and training_rules.json, so it always shows the
thresholds currently in force. Columns are the three age bands — younger groups carry
stricter temperature cut-offs; the band you've selected above is highlighted.
Temperature thresholds are provisional and need MJSC committee sign-off.
| Rule | U5–U8 | U9–U12 | U13–U16 |
|---|---|---|---|
| RED High Antecedent Rainfall | pre-session 12 h ≥ 5 mm & last 90 days ≥ 180 mm & last 7 days ≥ 20 mm | = all ages | = all ages |
| RED Waterlogged Ground | pre-session 12 h ≥ 25 mm | = all ages | = all ages |
| RED High In-Game Rainfall | in-session rain ≥ 6 mm | = all ages | = all ages |
| RED Extreme Cold and Rain | feels-like min ≤ -4° & in-session rain ≥ 1 mm | feels-like min ≤ -5° & in-session rain ≥ 1 mm | feels-like min ≤ -6° & in-session rain ≥ 1 mm |
| RED Extreme Cold | feels-like min ≤ -7° | feels-like min ≤ -8° | feels-like min ≤ -9° |
| RED Extreme Heat | feels-like max ≥ 36° | = all ages | = all ages |
| ORANGE Rainfall | pre-session 12 h ≥ 4 mm or in-session rain ≥ 8 mm | = all ages | = all ages |
| ORANGE Cold and Rain | feels-like min ≤ 4° & in-session rain ≥ 1 mm | feels-like min ≤ 3° & in-session rain ≥ 1 mm | feels-like min ≤ 2° & in-session rain ≥ 1 mm |
| ORANGE Cold | feels-like min ≤ 1° | feels-like min ≤ 0° | feels-like min ≤ -1° |
| ORANGE Heat | feels-like max ≥ 32° | = all ages | = all ages |
| GREEN Default | — | = all ages | = all ages |
| Rule | U5–U8 | U9–U12 | U13–U16 |
|---|---|---|---|
| RED High Antecedent Rainfall | pre-session 12 h ≥ 5 mm & last 90 days ≥ 180 mm & last 7 days ≥ 20 mm | = all ages | = all ages |
| RED Waterlogged Ground | pre-session 12 h ≥ 25 mm | = all ages | = all ages |
| RED High In-Game Rainfall | in-session rain ≥ 6 mm | = all ages | = all ages |
| RED Extreme Cold and Rain | feels-like min ≤ -4° & in-session rain ≥ 1 mm | feels-like min ≤ -5° & in-session rain ≥ 1 mm | feels-like min ≤ -6° & in-session rain ≥ 1 mm |
| RED Extreme Cold | feels-like min ≤ -7° | feels-like min ≤ -8° | feels-like min ≤ -9° |
| RED Extreme Heat | feels-like max ≥ 36° | = all ages | = all ages |
| ORANGE Rainfall | pre-session 12 h ≥ 4 mm or in-session rain ≥ 8 mm | = all ages | = all ages |
| ORANGE Cold and Rain | feels-like min ≤ 4° & in-session rain ≥ 1 mm | feels-like min ≤ 3° & in-session rain ≥ 1 mm | feels-like min ≤ 2° & in-session rain ≥ 1 mm |
| ORANGE Cold | feels-like min ≤ 1° | feels-like min ≤ 0° | feels-like min ≤ -1° |
| ORANGE Heat | feels-like max ≥ 32° | = all ages | = all ages |
| GREEN Default | — | = all ages | = all ages |
Thresholds are evaluated against the per-trial inputs described under
"How is this probability calculated?": at_min_09to12 / at_max_09to12
are the in-session feels-like floor and ceiling (heat is an apparent-temperature proxy — the
live BoM WBGT flag covers same-day heat).
policy_rules.json, the weekday training call uses
training_rules.json. Always cross-check the source forecast at
bom.gov.au
and follow your club's official call procedure before deciding (the 7:45 am call for games).
Pulled live from the Bureau of Meteorology each run:
Each Monte Carlo trial is fed through a set of rules, in order; the first rule that matches
decides the call. The weekend game cards evaluate the 9–12 window against
policy_rules.json; the weekday training cards evaluate the 15–18 window against
training_rules.json. The published P(RED) / P(ORANGE) / P(GREEN) are the fraction
of 20,000 simulated trials that landed in each outcome.
The exact rules and thresholds — for both the game and training calls — are shown in the Decision policy panel above, generated live from the policy files so they always match what's in force. Each call colour means: RED cancel, ORANGE inspect the surface / have a backup, GREEN go ahead.
Each card carries a small ⓘ "Why this call?" link under the action — collapsed by default to keep the coach view clean. Open it for the breakdown behind the call (for the age you've selected): a feels-like gauge showing where the session sits between the GREEN / caution / cancel lines and how far over they are, the rules that fired and how often, and the run's mean inputs. The feels-like gauge appears only when temperature is in play — feels-like is deterministic, so the marker is exact; rain is sampled, so for rain-driven days the fired-rule percentages, not a single value, tell the story.
The window-keyed names are historical (kept so a rules file is portable between windows): they mean the session window — 9–12 for games, 15–18 for training.
rain_mm_prev_12h — the 12 h before the session (overnight 21:00–09:00 for a game,
03:00–15:00 for training). Observed when available, forecast-sampled otherwise.rain_mm_prev_168h — last 7 days. Observed for past days, forecast-sampled for
any days still ahead.rain_mm_prev_90d — last 90 days (antecedent). Mostly observed.rain_mm_09to12 — rain during the session window. Always forecast.at_min_09to12 — apparent-temperature floor across the session window. Deterministic
from BoM's 3-hour feels-like values (no sampling).at_max_09to12 — apparent-temperature ceiling across the session window (the heat
analogue of the floor). Deterministic. See the heat note below.Cold (and heat) tolerance depends heavily on age, so each day is evaluated for three bands — MiniRoos (U5–U8), Junior (U9–U12) and Youth (U13–U16) — with progressively stricter temperature cut-offs for younger players. The weather is sampled once per trial and scored against all three age thresholds, so the bands are directly comparable. Use the age selector near the top to switch which band every card shows (it's remembered on your device); the Decision-policy panel lists all three side by side. The rainfall/antecedent rules are common to all ages; only the temperature thresholds differ. With JavaScript off, the strictest band (U5–U8) is shown.
Heat is handled in two tiers. For the forecast horizon (days ahead) we use
at_max_09to12, the session's apparent-temperature ceiling, as a heat-stress
proxy — BoM's forecast has no humidity or wind, so a true WBGT can't be forecast. For the
same day we show Orange's live WBGT and BoM's official heat-stress flag
(IDN65179) on today's card — the
recognised sports standard, shown verbatim. Heat thresholds are provisional and need MJSC committee
sign-off; always cross-check the live BoM flag and Sports Medicine Australia guidance.
For each macro-window (9–12, overnight, daily) we pick a (low, high) band keyed on the
average BoM chance-of-rain across the slots covering that window, then sample uniformly.
When BoM publishes a "10% chance of more than X mm" amount, the upper bound is widened
to honour it. See BANDS_3H / BANDS_12H / BANDS_24H at the top of
src/forecast.py.
Two stacked 3-hour strips per day card show BoM's published forecast at slot granularity.
Each slot moves through three states as the day progresses, drawing on Orange Airport's half-hourly feed:
now. This fills the gap where BoM has blanked the current slot's
forecast column but the 3 hours haven't finished.obs.Observed rain cells (now and obs) are coloured by mm
(green < 0.2, yellow 0.2–1, orange 1–4, red ≥ 4) rather than chance-of-rain.
The session windows are configured by GAME_HOUR_START / GAME_HOUR_END and
TRAIN_HOUR_START / TRAIN_HOUR_END in src/forecast.py. The rain headline
beneath the strips refers to the wettest 3-hour window, not a daily total — BoM's detailed
page doesn't publish a daily roll-up.
As a session approaches, the dashboard computes how much rain has actually fallen in the 12-hour window before it — overnight 21:00–09:00 for a morning game, 03:00–15:00 for an afternoon training. When that window is fully observed, the forecast estimate is replaced with the observed value; when it's only partly observed, observed rain is blended with a scaled forecast sample for the unobserved tail. A green-bordered "rain before…" block appears on the day card when this is active.
The training cards run the same engine described above on the 15:00–18:00 window
against training_rules.json, for each upcoming weekday (Mon–Fri) within BoM's 7-day
horizon — afternoons already finished are dropped, so you see up to five rolling sessions. The call
is the chip in each row's summary; expand for the action, the pre-session rain, and the day strips.
Training thresholds ship as a copy of the game rules and are tuned independently in
training_rules.json.
GitHub Actions runs the pipeline four times a day shortly after each BoM forecast issue (04:30, 10:30, 16:30, 22:30 AEST), plus an extra run at 07:00 AEST on Sat & Sun to refresh before the 7:45 am call. It also runs on any push to the code/policy. The "Next update" pill near the top of the page shows the actual next scheduled fire time.
This is a more BoM-faithful version of the project's manual runbook process. On borderline
days expect probabilities slightly less alarmist than a hand calculation using the runbook's
deliberately-wide bands. To shift toward more conservative readings, widen the bands in
src/forecast.py.