Skip to content

Releases: mabo-du/fritts

Fritts v0.3.0

Choose a tag to compare

@mabo-du mabo-du released this 01 Jul 20:32
04ac1b4

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 .fh reader — FH2.1/FH1.0 magic, KEY=/DATEBEGIN=/
    UNIT=/DENDRO= headers, decadal blocks with year labels, single-column format,
    multi-series files, -9999 missing values, 9999 stop code, UNIT-based divisor.
    Compatible with dplR::read.fh. Legacy HEADER:/DATA: subset auto-fallback.
    20 new tests.

  • QThread workers for all long-running analysesCrossDateWorker,
    DetrendWorker, BuildChronologyWorker, QCWorker move 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) where r̄_bt is the
    overlap-weighted mean of between-tree pairwise correlations (within-tree pairs
    excluded). Set tree_id on each series' metadata dict. Falls back to all-pairs
    with a warning when no tree metadata is provided. R-bar matches. Chronology
    metadata now stores eps, 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), limit clamped to [1, 45], SSL context verification.

  • Full undo/redo (including imports)AddSeriesCommand wraps every
    add_series call site in ui/. Imports (file, image, ITRDB) are now undoable
    via Ctrl+Z. 200-step CommandStack (uses collections.deque).

  • Tucson two-pass parser — ITRDB -9999 mid-series values are now correctly
    treated as missing (NaN), not stop codes. Real ITRDB .rwl files 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)
    with max_examples=200, deadline=1000ms.

  • Algorithm correctness fixes — AR(p) lag reversal fixed (CRITICAL), biased
    1/n autocovariance matching dplR::ar.yw, AIC uses n − order, Tukey
    biweight uses raw MAD (removed 1.4826 factor, matches dplR::tbrm),
    _pearson_to_t returns 0.0 for NaN input and -99.0 for perfect negative
    correlation, _wuchswerte preserves NaN.

  • Spline detrend period parameter — Butterworth low-pass filter at
    1/period cycles/year when period is provided.

  • RCS upgrades — Tukey biweight robust mean per cambial-age cohort (was
    median), pith_offsets parameter, min_depth parameter (default 5).

  • Workspace rebindingset_session() on SeriesListPanel, SeriesView,
    ChronologyBuilderDock properly rebinds panels after Open Workspace.
    inf/-inf now serialise as null (was only NaN). _workspace_path
    committed only after successful write.

  • Image measurement — default series ID IMG_01 (was IMG_SERIES_01,
    violated 8-char validation), DPI read from QSettings, 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
    QSettings on startup (were saved but never applied).

  • CI.github/workflows/ci.yml installs xvfb, libegl1, libgl1,
    libxkbcommon-x11-0 and runs xvfb-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.md and docs/USER_GUIDE.md comprehensively rewritten for v0.3.0.
  • docs/research-papers/Dendrochronology Algorithm Reference Validation.md
    has a Status: FIXED in v0.3.0 note appended to each algorithm section.
  • CHANGELOG.md has a full v0.3.0 entry (Added/Changed/Fixed/Removed).

Known limitations

  • Direct dplR numerical 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 period parameter is a Butterworth approximation to dplR::ffcsaps's
    FFT-based spline.
  • EPS without tree_id metadata 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

Full Changelog: v0.2.0...v0.3.0

Fritts v0.2.0

Choose a tag to compare

@github-actions github-actions released this 21 Jun 20:51

Full Changelog: v0.1.5...v0.2.0

Fritts v0.1.5

Choose a tag to compare

@github-actions github-actions released this 12 Jun 05:02

Full Changelog: v0.1.4...v0.1.5

Fritts v0.1.3

Choose a tag to compare

@github-actions github-actions released this 13 Jun 02:22

Full Changelog: v0.1.2...v0.1.3

Fritts v0.1.2

Choose a tag to compare

@github-actions github-actions released this 13 Jun 02:02

Full Changelog: v0.1.1...v0.1.2

Fritts v0.1.1

Choose a tag to compare

@mabo-du mabo-du released this 05 Jun 23:41