Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 18:47
f9fad4a

0.2.0 (2026-08-23)

⚠ BREAKING CHANGES

  • MultitaperEstimator.adaptive and TransformConfig.adaptive now default to False. Adaptive weighting collapses for off-centre transients, and a seismic arrival in a refined window is one.
  • modules move to src/specmod/ and are renamed to snake_case (Spectral -> spectral, PreProcess -> preprocess, ModelGuess -> model_guess).

Features

  • acquire: fetch an event from FDSN into the layout datasets reads (61c3ebc)
  • acquire: name the event catalogue separately from the waveform archive (be1a00a)
  • add centring, which removes the position bias completely (144db2f)
  • add floors job to test workflow for minimum dependency resolution (171e0bc)
  • add layered configuration with recorded provenance (ea7a429)
  • add Prieto's multitaper package as an optional backend (7ff6639)
  • add the pluggable transform layer and its normalisation contract (1ba5da0)
  • add the smoothing layer and document a multitaper transient bias (5ace1a9)
  • add variance normalisation and document what each transform does (683b353)
  • api: a stable import surface for downstream packages (72fc3a9)
  • core: add the typed collection layer that replaces SNP and Spectra (5b7510d)
  • core: make bandwidth selection a registry, and fix a wrap in the default (9166d86)
  • core: name both amplitude conventions instead of implying one (b2bef97)
  • core: validate that record geometry is self-consistent (2bda2a1)
  • datasets: load published datasets through pooch, pinned by hash (70735a8)
  • datasets: name the event layout once, and fix what the move missed (67a0aa6)
  • distance: make the source-to-site distance a registry, and read it (782760c)
  • fitting: default the model to what the configuration asks for (3a208e6)
  • io: HDF5 for arrays, Parquet for tables, and no pickle anywhere (b95a858)
  • magnitude: compute M0 and Mw, and register geometric spreading (4796605)
  • make the package installable and importable (30b4e89)
  • noise: port ROT_METHOD=1 and reduce utils.py to what has callers (3485019)
  • picks: a reader registry, detected by sniffing rather than by suffix (333b8b3)
  • picks: move to QuakeML, and stop acquire discarding the catalogue (041af07)
  • picks: plugin readers, and a CSV reader you configure yourself (d00bb5f)
  • picks: resolve arrivals to sensors instead of matching strings (e16ea23)
  • pipeline: waveforms to SpectrumSet with no legacy object in between (b9a30fd)
  • release: release-please, and PyPI publishing in the same workflow (47fe5e4)
  • restore the three capabilities that went with the legacy containers (abcdb96)
  • sources: connect config.model.source to something, at last (99da9a4)
  • spectral: convert the legacy container to a SpectrumSet (0b47b3d)
  • spectral: run the legacy pipeline on the rewritten estimators (bdec9ff)
  • staged: the two-stage event fit, with selection after quality control (0702ba7)
  • tools: generate the measured tables in the docs, and move CLIs to click (ad2ad8a)
  • transforms: add n_fft padding strategies, and document what padding does (50d3812)
  • transforms: add quadratic multitaper, vendored from Prieto (3a20470)
  • transforms: add the continuous wavelet transform and scalogram QC (47bb5a9)
  • typing: close the mypy backlog, and stub lmfit to do it (b208773)
  • typing: stub ObsPy, and annotate utils and preprocess against it (de640cc)

Bug Fixes

  • ci: keep the suite green without the multitaper extra (4123677)
  • core: derive the binned noise from the lifted noise, not beside it (b2adc0b)
  • core: derive the fold tolerance from bin spacing, not a fixed rtol (b5afbb7)
  • core: read the recorded resolution floor instead of re-deriving it (15b8efc)
  • correct commands in build and test workflows to use 'uv' instead of 'uvx' (c8fde4f)
  • correct dependency floors that were unsatisfiable (cb4e0d5)
  • datasets: correct the PNR origin time, and source its magnitude (d0c210b)
  • datasets: take the PNR hypocentre from the published catalogue (2977318)
  • default multitaper adaptive weighting off, and quantify why (628d36d)
  • deps: raise two floors that were never installable (41cd88d)
  • fitting: repair write_flatfile, and stop requiring a mutable container (80560fd)
  • fitting: stop freezing configuration at import, and stop printing (c151425)
  • make the golden reference portable, and fix the lint drift (b366f19)
  • make the pipeline reproducible by removing three discontinuities (982cc9f)
  • multitaper: correct units in Thomson's adaptive weighting (6410187)
  • noise: remove the fourth discontinuity, an "already touching" guard (60c9731)
  • pipeline: reject estimator keywords instead of discarding them (f22c523)
  • preprocess: repair the six defects the characterisation exposed (6a869b3)
  • quadratic: guard the damping term against a zero denominator (650a1a7)
  • quadratic: renormalise adaptive weights before the curvature fit (c03b348)
  • spectral: hand the legacy classes writable arrays (8e8dc31)
  • spectral: keep the unfolded amplitude convention Omega is defined in (2770150)
  • spectral: refuse bandwidth below what the noise window resolves (48590d1)
  • spectral: repair the domain-change path, and delete the dead band search (b06c14c)
  • stubs: drop a parameter lmfit 1.2 does not have, and catch the next one (b17d17a)
  • test: gate the checks the pipeline's discontinuities make machine-specific (a64bfac)
  • tests: make the default-install path checkable locally (9ddd3e4)
  • test: the noise divergence is hardware, not library versions (4265e9e)
  • tools: stop make_golden.py deleting the legacy record it cannot rebuild (878e849)
  • update build workflow to use 'uvx' for metadata check and remove unnecessary steps (52b026e)
  • update pip install command to remove --system flag (eb20f8c)
  • update ruff and mypy commands to use 'uv run' for execution (d33d2aa)
  • update ruff and mypy commands to use 'uvx' for execution (5a4ba42)
  • update test workflow to ensure virtual environment is created before dependencies installation (e70ee1a)
  • update test workflow to install mypy and pytest correctly (e5ae90a)

Performance

  • rotation: solve the noise lift instead of searching for it (c0f9cc8)

Code Refactoring

  • config: delete _config_legacy.py, read the typed Config instead (874b80a)
  • config: move the distance measure to its own [geometry] section (5e9a366)
  • delete models.py and model_guess.py (046bdec)
  • delete spectral.py (d43ce05)
  • fitting: accept a SpectrumPair, not just the legacy Signal (95a48ce)
  • fitting: split the 745-line module into a package (a271b12)
  • picks: split the delimited reader from the CSV one (91615d7)
  • preprocess: rename set_picks_from_pyrocko to set_picks (4728c87)
  • read the golden reference through SpectrumSet (6f228e4)
  • spectral: put SNP on SpectrumPair and delete what it duplicated (cdedb32)
  • spectral: share the binning and rotation with core.collection (1a969c8)

Documentation

  • a developer guide, and one for the documentation itself (aee252d)
  • a release runbook, a roadmap, and say plainly that this is alpha (94ae4b5)
  • a Sphinx site — skeleton, API reference, and the Pages workflow (97c001e)
  • add a transforms walkthrough notebook and pin down the phase question (2fbf396)
  • add layered configuration architecture (a100549)
  • add refactoring plan for modernization and pluggable transforms (a02f308)
  • add specmod.datasets, pooch hosting and the Magna 2020 validation set (2203232)
  • adopt clean-break API policy and pre-refactor preservation plan (e05fb1d)
  • adopt main as trunk with master frozen as pre-refactor record (1e70705)
  • assume noise rotation was on for the published run (30a71f7)
  • build the window-position note into the site (87cd678)
  • correct test-data recommendation, keep fixtures in git (83e971b)
  • correct the multitaper transient-bias explanation (2a86f2f)
  • derive the copyright year from the build (b6cd31d)
  • expand refactor plan with scalogram QC, Sphinx and release automation (cca04f7)
  • give the pick-format page a way in, and correct a stale test docstring (527386b)
  • kebab-case the page filenames, since they are URLs (ebd838d)
  • magnitude: the PNR catalogue value is unsourced, and probably ML (d82c807)
  • make waveform acquisition general and config-driven (bd58652)
  • measure what reverse-engineering pywt's normalisation actually takes (657a4c8)
  • picks: make the new docstrings say what the code is, not how it got here (6282bc9)
  • plan: add §7.1, the work that is designed but not on the path to 1.0 (8e46a8a)
  • plan: audit the enforcement claims, and correct four that were false (8ba4a17)
  • plan: bilinear spreading belongs in the design, but one event cannot fit it (9ce99b7)
  • plan: close out 2b, and correct what building it disproved (9df20c7)
  • plan: ground the station/channel type in FDSN/SEED, and record what checking it found (d0d257b)
  • plan: keep Magna as the calibration anchor, and say why (73f630a)
  • plan: record what could and could not be verified in the thesis equations (b1090cf)
  • plan: separate the units hazard from the radiation-pattern coefficient (1806ed9)
  • plan: source four transform defaults from the published method (4236e42)
  • plan: source the moment constants from the thesis, and settle both R units (391ccc0)
  • plan: spec a pluggable pick-reader layer (§4.9) (b1db5c0)
  • plan: specify the basic Mw, and settle the spreading exponent by measurement (32c39a8)
  • plan: the unit of R depends on the formulation, and only calibration settles it (fa3a4ba)
  • publish through Read the Docs instead of GitHub Pages (1548017)
  • re-measure every figure that depended on the old hypocentre (4b803a0)
  • record fork detachment decision and post-detach checklist (63c7c75)
  • record the cwt-only reproducibility residual and the PyWavelets option (d81d8e3)
  • record which parts of the multitaper package actually work (c92e99f)
  • record why the fit is done in the sensor's natural units (955b005)
  • redesign persistence around access patterns instead of pickle (80b0f84)
  • rewrite the adaptive-weighting story around the fix (b9dabd8)
  • rewrite the README and remove contact details (4ecb604)
  • say what versioned docs would actually take (839d1b4)
  • scope validation to a distance-spread broadband subset (c6f3907)
  • set up Read the Docs through the GitHub App, not a webhook (acad354)
  • state current behaviour and its gotchas, not the change history (3d519e0)
  • the velocity peak sits at fc for the whole omega-squared family (9d9db66)
  • transcribe the published Magna workflow and its validation targets (987a073)
  • tutorial: rewrite the notebook, and fix what running it exposed (a7ff86e)
  • tutorial: show the API and the fifteen lines it replaces, side by side (49107cc)
  • tutorial: show why the fit needs many stations and two stages (4e666f3)
  • write the processing chain down as equations, and make noise models plural (46bf00a)

Build System

  • delete the ci/ workflow mirror (5639d28)
  • install both hook types, and write the rules agents keep breaking (a047218)
  • keep data tags out of the package version, and write the release runbook (7420832)
  • quiet the floors job, and take docs.yml's venv fix into ci/ (88370a0)