Skip to content

The changelog below is the same one shown inside the application under Settings → About. It is included verbatim from the project's canonical changelog, so this page always matches the released build.

Changelog

All notable changes to Cascade Hydro are recorded here. This file is shown in the app under Settings → About and is the source for release notes.

0.5.12 — ECCC IDF validation suite; canonical completeness anchor; docs tracked

  • External validation against published ECCC IDF data. New tests/test_validation_eccc_idf.py checks the pipeline against ECCC's own published IDF product for VANCOUVER HARBOUR CS (1108446). Layer 1 feeds ECCC's annual-maxima series through the tool's Gumbel/MoM fit and reproduces ECCC's published return-level depths to rounding (worst 0.74%, mean 0.17% across 54 cells). Layer 2 runs a real ECCC daily record through the full in-app pipeline (completeness + Grubbs screening + Gumbel/MoM + ecozone ratios); after the WMO/Hershfield ×1.13 fixed-window adjustment the 24 h curve matches ECCC within 1.5%, and sub-daily falls inside ECCC's own stated ±25% uncertainty. The ECCC reference file is committed verbatim as the ground truth; test fixtures live in tests/data/ and are not packaged into the build. Human-readable baseline for drift detection: docs/VALIDATION.md.
  • Completeness threshold anchored to a canonical source. The 90% default is now justified in the Methods & References registry against the WMO convention (≤10% missing; Guide to Climatological Practices, WMO-No. 100).
  • Project docs are now version-controlled. docs/ (and the PROVENANCE.md / README_RATIOS.md filename patterns) were previously git-ignored, so docs/PROVENANCE.md — cited as the ratio "methodology of record" — had never been committed. Fixed; docs/_build/ stays ignored.
  • Added ROADMAP.md as the planned-work backlog (sibling to the changelog).

0.5.11 — UI package reorg; fix clipped panel margins & Diagnostics placeholder

  • app/ UI reorganised (no behaviour change): the old grab-bag windows/ package is split into tabs/ (the tab bodies — map_tab, analysis_tab, idf_tab, diagnostics_tab, references_tab) and dialogs/ (about, options, comparison, import, design-storm, station-picker, year-review, outlier-review, splash). Tab classes follow the <Name>Tab convention (AnalysisWidgetAnalysisTab, IDFWidgetIDFTab, etc.). main_window.py (the app shell) stays in windows/. Remaining typing.Optional[…] hints normalised to X | None.
  • Left-panel margins no longer clipped when a dropdown is expanded. The 0.5.10 margin constants had no visible effect because the real cause was an overflow: the long, non-wrapping enable checkboxes ("Exclude incomplete years from this analysis" / "Exclude outliers from this analysis") and the "Combine…" dropdown forced the fixed-width control panel wider than its scroll viewport. With the horizontal scrollbar off, every section's right margin was clipped. The checkbox labels are now short (the detail moves to the description beneath), and the enable checkboxes, method/tail combos, and sub-headings are allowed to shrink/wrap so no control can widen the panel past its viewport at any DPI. Affects the Analysis and IDF tabs.
  • Diagnostics tab shows "Data ready" once data is loaded. It previously always displayed "No data loaded" — even with data loaded — because diagnostics wait for an explicit Run. It now mirrors the Analysis/IDF tabs: "No data loaded" only when empty, and "Data ready — click ▶ Run Diagnostics" once a dataset is present.

0.5.10 — Fix missing ecozone data in build; standardize panel margins

  • Ecozone boundary file now ships. The 4.7 MB ecozones.geojson was not packaged once CI moved to a non-editable install, so the installed/frozen app reported "boundary file not installed" and fell back to province/national ratios. Declared it as package data ([tool.setuptools.package-data]); the build now bundles it and lat/lon → ecozone works. A post-build CI check and new test_region_lookup.py guard against the regression.
  • Consistent control margins. The left-panel and collapsible-section ("dropdown") body margins were horizontally asymmetric, so buttons/spinboxes ran to the right edge. Both are now symmetric and centralised in ui_constants (PANEL_MARGINS, SECTION_BODY_MARGINS), applied across every tab's dropdowns.

0.5.9 — Analysis test suite & release gate

  • Comprehensive correctness tests for every analysis module — distribution fitting and return levels, the IDF pipeline and curve fits, outlier screening (Grubbs/IQR/MAD), diagnostics (Mann-Kendall, Pettitt, autocorrelation, completeness, record adequacy), design storms, and sub-daily ratios. The suite grew from 24 to 83 tests and favours independent ground truth (closed-form estimators, analytic quantiles, known statistical results, physical invariants) over snapshots.
  • Release gate: release.yml now runs pytest before building, so a release cannot ship with a failing analysis. Pytest config centralised in pyproject.toml; seeded fixtures in tests/conftest.py.
  • Moved the ECCC coordinate diagnostic out of tests/ (it was a network script, not a test) to scripts/diagnose_eccc_coords.py.

0.5.8 — Dead-code & dependency cleanup

  • Dropped four unused dependenciesstatsmodels, lmoments3, seaborn, plotly. Nothing imported them (L-moments fitting is implemented in-house); statsmodels/lmoments3 were also being bundled into the .exe, so the packaged build shrinks. Only numpy, pandas, scipy, matplotlib, PySide6, cryptography remain.
  • Removed dead UI code — the retired station_explorer.py and location_picker.py dialogs are deleted; their reusable map/geocode/worker helpers now live in app/utils/map_support.py (single source of truth for the Map tab). Also removed two orphaned .ui files and an empty example CSV.

0.5.7 — Auto-update fix + restart-to-update banner

  • Auto-update now works. The client used a non-existent velopack.sources path and silently fell back to a URL source that 404'd against the private releases repo. It now uses velopack.GithubSource (confirmed against velopack 1.2.0) with the baked-in read token. NOTE: this fix only takes effect from 0.5.7 onward — a 0.5.6 install cannot auto-update itself and must be updated by reinstalling 0.5.7 once.
  • Restart-to-update banner. When an update finishes downloading in the background, a dismissible banner appears above the tabs: "Update X downloaded — restart to apply" with Restart now / Later. Later keeps the silent behaviour (applies on next launch); Restart now applies immediately. Themed for dark/light.
  • Docs sync. README updated to the shipped state (version, architecture, Methods & References, the now-sourced sub-daily ratios); package author set; examples/ marked as synthetic sample output.

0.5.6 — Fix frozen build (Windows .exe)

  • Packaged .exe now launches. The PyInstaller build shipped an empty idf_analyzer/ namespace directory (data files only, no code), so the app crashed on startup with cannot import name '__version__' from 'idf_analyzer'. The spec now collects the package's submodules, and CI installs it non-editable (pip install .) so PyInstaller can trace it. No app behaviour changed — packaging only.

0.5.5 — Screening everywhere, impact comparison & record adequacy

  • Completeness & outlier screening now apply to every Analysis-tab analysis (time series, annual maxima, monthly statistics, distribution fit, comparison, and the outlier explorer) — not just Distribution Fit — so nothing runs silently on unscreened data. The controls are always visible (the "Exclude outliers" section is hidden only for the outlier explorer, which must keep its outliers). Each tab still screens independently.
  • Compare impact: a new button on the Analysis and IDF tabs renders the result with and without the active screening side by side, with a summary of what changed (years excluded, outliers removed, and the before/after shift in a headline figure such as the 100-yr level).
  • Record adequacy on the Diagnostics tab: the completeness section is reframed as a standalone assessment that reports effective record length and a ~2× return-period reliability ceiling. Removed the outdated text implying it configures the Analysis/IDF tabs (which now screen independently).
  • Consistent plot typography: axis/title fonts are centralised in plot_theme.py and normalised across tabs (the Diagnostics and Design-storm titles were off-standard).
  • Methods & References updated: new "Record adequacy" and "Compare impact" entries, an updated completeness entry, and a Stedinger et al. (1993) citation; the reliability factor is rendered live with a drift-guard test.

0.5.4 — Map tab & Data tab overhaul

  • Consolidated Map tab (now the landing tab): a single map and pin handles both ECCC station search/import and project-location/ecozone selection, replacing the two separate map dialogs. The Data tab still supports plain CSV/Excel upload for non-ECCC data.
  • Location provenance: the active location now shows whether it was derived from an ECCC station or set manually — which matters for ecozone-based IDF — and is saved with the session.
  • Climatic region on the Data tab: states the ecozone the loaded data will use for sub-daily / IDF ratios, with a warning when none is selected.
  • Dataset summary reworked into Record and Precipitation groups, with new Resolution and Years-of-Record cards, units folded into the precipitation cards, magnitude-aware number formatting, and the expected-records count moved to a tooltip on Missing Timestamps. The analysis-column and units selectors now live in the Precipitation group header.
  • Data overview chart: the annual-max markers appear only in "Monthly max" mode so monthly means/totals stay readable; axis-cutoff and short-window clipping fixed; the tab scrolls when the window is short.
  • Progress feedback for every tab (and the map) now shows in the shared log panel rather than beside each tab's own controls.
  • Uniform outer border across all tabs; dark/light theming throughout the new and reworked UI.

0.5.3

  • Calculated sub-daily depth ratios derived from ECCC station data.

0.5.2

  • Sub-daily depth-ratio derivation.

0.5.1

  • GitHub release pipeline.

0.5.0 — Validation beta

First build prepared for field validation with hydrologic engineers. - Version is now single-sourced (idf_analyzer._version) and shown in About, report footers, and exported metadata. - Diagnostics tab: the empty plot now shows a "No data loaded" message, consistent with the Analysis and IDF tabs. - Added an auto-update path (Velopack), a Settings → About dialog, a GitHub Actions release workflow, and a placeholder beta licence/disclaimer. - Note: sub-daily depth-ratio tables remain marked "source required" — see the warning in the IDF tab and exported reports.

0.4.0 — Methods & References

  • Searchable Methods & References tab: each method's equations, live data tables, and source citations (with DOIs), reused in report footers.
  • Drift-guard tests tying displayed tables to the values the code computes with.

0.3.3

  • Type-checking / Pylance fixes.

0.3.2

  • SCS / NRCS Type I–III design-storm support.
  • Assorted bug fixes.

0.3.1

  • Improvements to data import and the data view.

0.3.0

  • New Diagnostics tab: completeness screening, world-record envelope, Mann–Kendall trend with Sen's slope, Pettitt change point, autocorrelation.

0.2.x

  • Partial IDF functionality and a UI refactoring pass; assorted bug fixes.