Releases: mabo-du/fritts
Release list
Fritts v0.3.0
Release v0.3.0 — 2026-07-01
Fritts v0.3.0 is a research-grade dendrochronology release. Every algorithmic
deviation identified in the v0.2 review cycle has been corrected (79 findings,
100% fix rate), the long-running analyses no longer freeze the UI, the ITRDB
client is hardened against SSRF, and the test suite has grown from ~95 to 230+
tests (234 collected, 213 passing, 21 skipped without DISPLAY, 1 pre-existing
libEGL failure that passes in CI).
Highlights
-
Full TSAP-Win Heidelberg
.fhreader — FH2.1/FH1.0 magic,KEY=/DATEBEGIN=/
UNIT=/DENDRO=headers, decadal blocks with year labels, single-column format,
multi-series files,-9999missing values,9999stop code, UNIT-based divisor.
Compatible withdplR::read.fh. LegacyHEADER:/DATA:subset auto-fallback.
20 new tests. -
QThread workers for all long-running analyses —
CrossDateWorker,
DetrendWorker,BuildChronologyWorker,QCWorkermove cross-date, detrend,
chronology build, and COFECHA QC off the GUI thread with modal progress dialogs.
The UI no longer freezes. -
Standard Wigley/Briffa (1984) EPS with per-tree metadata —
EPS = (n_trees · r̄_bt) / (1 + (n_trees − 1) · r̄_bt)wherer̄_btis the
overlap-weighted mean of between-tree pairwise correlations (within-tree pairs
excluded). Settree_idon each series'metadatadict. Falls back to all-pairs
r̄with a warning when no tree metadata is provided.R-barmatches. Chronology
metadatanow storeseps,rbar,n_trees. -
SSRF-hardened ITRDB client — HTTPS-only, hostname whitelist
(ncei.noaa.gov+ subdomains), redirect-blocking opener, streaming 100 MB cap
(64 KB chunks),limitclamped to [1, 45], SSL context verification. -
Full undo/redo (including imports) —
AddSeriesCommandwraps every
add_seriescall site inui/. Imports (file, image, ITRDB) are now undoable
viaCtrl+Z. 200-stepCommandStack(usescollections.deque). -
Tucson two-pass parser — ITRDB
-9999mid-series values are now correctly
treated as missing (NaN), not stop codes. Real ITRDB.rwlfiles no longer
get silently truncated at the first missing ring. -
Hypothesis fuzz tests for the Tucson parser — 5 property-based tests
(never-crash, round-trip preservation, random bytes, unicode, embedded nulls)
withmax_examples=200,deadline=1000ms. -
Algorithm correctness fixes — AR(p) lag reversal fixed (CRITICAL), biased
1/nautocovariance matchingdplR::ar.yw, AIC usesn − order, Tukey
biweight uses raw MAD (removed 1.4826 factor, matchesdplR::tbrm),
_pearson_to_treturns0.0for NaN input and-99.0for perfect negative
correlation,_wuchswertepreserves NaN. -
Spline detrend
periodparameter — Butterworth low-pass filter at
1/periodcycles/year whenperiodis provided. -
RCS upgrades — Tukey biweight robust mean per cambial-age cohort (was
median),pith_offsetsparameter,min_depthparameter (default 5). -
Workspace rebinding —
set_session()onSeriesListPanel,SeriesView,
ChronologyBuilderDockproperly rebinds panels afterOpen Workspace.
inf/-infnow serialise asnull(was onlyNaN)._workspace_path
committed only after successful write. -
Image measurement — default series ID
IMG_01(wasIMG_SERIES_01,
violated 8-char validation), DPI read fromQSettings, edge-replication
padding (no artificial dark bands), grayscale 2-D auto-stacked to 3-channel. -
Preferences — DPI and theme settings are now actually read from
QSettingson startup (were saved but never applied). -
CI —
.github/workflows/ci.ymlinstallsxvfb,libegl1,libgl1,
libxkbcommon-x11-0and runsxvfb-run -a python -m pytest tests/. The
8 new qtbot interaction tests run in CI.
Test suite
- 234 tests collected, 213 passing, 21 skipped (need DISPLAY/libEGL),
1 pre-existing failure (test_command_stack_cleared_on_session_replacement,
libEGL import — passes in CI). - 12 test files:
test_regression.py,test_session_serialization.py,
test_commands.py,test_crossdate.py,test_tucson_parser.py,
test_io_formats.py,test_tucson_fuzz.py,test_itrdb.py,
test_detrend.py,test_export_r.py,test_ui_fixes.py,test_ui_smoke.py.
Documentation
README.mdanddocs/USER_GUIDE.mdcomprehensively rewritten for v0.3.0.docs/research-papers/Dendrochronology Algorithm Reference Validation.md
has aStatus: FIXED in v0.3.0note appended to each algorithm section.CHANGELOG.mdhas a full v0.3.0 entry (Added/Changed/Fixed/Removed).
Known limitations
- Direct
dplRnumerical verification of EPS/spline/RCS/biweight is pending
(R cannot be installed in the development sandbox). Formulas match published
definitions; closed-form property tests verify the math. - Spline
periodparameter is a Butterworth approximation todplR::ffcsaps's
FFT-based spline. - EPS without
tree_idmetadata falls back to an all-pairs formula that
over-estimates EPS when multiple cores per tree exist (a warning is logged). - The aggregate per-series COFECHA health metric is still per-segment only.
Historical release notes: release_notes_v0.1.3.txt, release_notes_v0.1.4.txt,
release_notes_v0.1.5.txt.
What's Changed
- chore(deps): update pyqtgraph requirement from <0.14,>=0.13 to >=0.13,<0.15 by @dependabot[bot] in #1
- v0.3.0: Comprehensive code review fixes (79 findings, 100% fix rate) by @mabo-du in #5
- chore(deps): update numpy requirement from <2,>=1.26 to >=1.26,<3 by @dependabot[bot] in #3
- chore(deps): update lxml requirement from <6,>=5.0 to >=5.0,<7 by @dependabot[bot] in #4
New Contributors
- @dependabot[bot] made their first contribution in #1
Full Changelog: v0.2.0...v0.3.0
Fritts v0.2.0
Full Changelog: v0.1.5...v0.2.0
Fritts v0.1.5
Full Changelog: v0.1.4...v0.1.5
Fritts v0.1.3
Full Changelog: v0.1.2...v0.1.3
Fritts v0.1.2
Full Changelog: v0.1.1...v0.1.2
Fritts v0.1.1
Full Changelog: https://github.com/mabo-du/fritts/commits/v0.1.1