From b2ef02ebccc394e292663709718c6b27699f99d4 Mon Sep 17 00:00:00 2001 From: serversdown Date: Thu, 27 Aug 2026 16:35:47 +0000 Subject: [PATCH] =?UTF-8?q?chore(release):=20v0.26.0=20=E2=80=94=20series-?= =?UTF-8?q?3=20decode=20correctness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two body-model rewrites, a systematic scale error affecting every geophone reading the system ever produced, a recovered file format, and two artifact-hygiene bugs where stale files outlived the decodes that made them. - geo full scale is 32000 ADC counts, not 32768 (every reading 2.34% low) - the waveform body is a record chain, not a tag stream - the histogram block is big-endian, with a terminal tail - sub-minute intervals pack several per block (415 files recovered) - three more defects found by a full-corpus sweep, each masking the next - stale .h5 files and stale shape_* columns are now cleared, not left All 11,603 series-3 binaries in the production snapshot pass every check. Ground truth: 1,211/1,211 histograms exact per-interval, 75/75 waveform sample counts exact, multi-interval fixture exact on all 45,680 values. Also corrects a changelog note that went stale within the same day: the "3 of 75 events still truncate" item was resolved by the record-chain rewrite, and the remaining open items are now listed explicitly. CLAUDE.md gains a "Where things stand" block at the top — the header had been reading v0.21.0, four releases behind, which is the first thing you see when picking the project back up. Tests: 259 passed; the 16 failures are pre-existing (gitignored fixtures) and unchanged from baseline. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01HgTe8CamXAHcAmaQ6QNcog --- CHANGELOG.md | 31 ++++++++++++++++++++++++++----- CLAUDE.md | 29 ++++++++++++++++++++++++++++- pyproject.toml | 2 +- sfm/server.py | 2 +- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 253e875..5284dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ All notable changes to seismo-relay are documented here. ## [Unreleased] +--- + +## v0.26.0 — 2026-08-27 + +**Series-3 decode correctness.** Two body-model rewrites, a systematic +scale error affecting every geophone reading ever produced, a recovered +file format, and two artifact-hygiene bugs where stale files outlived the +decodes that made them. All 11,603 series-3 binaries in the production +snapshot now pass every check. + ### Fixed - **Series-3 health sweep: 11,603 / 11,603 binaries now clean on every check.** @@ -261,11 +271,22 @@ gitignored fixtures). the ACH queue with garbage events. Store-wide it affects 2 units of 21 across 6 episodes; see `scratch/offset_candidates.csv` and the project memory notes. -- **Still open:** 3 of 75 ground-truth events truncate at a segment-header - variant with a variable-width prefix before the channel-id field (2, 4 or 6 - bytes observed) and an `01 00` marker instead of `02 00`. See the protocol - reference, "Unmapped: variable-prefix segment descriptors". Examples: - `BE12599/N599LPNB.JF0W` at body offset 1155, `BE9558/K558LOF2.820W` at 1485. +- ~~**Still open:** 3 of 75 ground-truth events truncate at a segment-header + variant with a variable-width prefix.~~ **Resolved later the same day** — the + record-chain rewrite (above) showed there is no variable prefix; it was + walker drift. All 75 are now sample-count exact. + +- **Still open after this release:** + - **Series-4 (Thor / Micromate) is not verified** — UM-series sits at ~48% + against device peaks with a ~1.7% systematic bias and a near-zero tail. + Thor IDFW is pinned to `decode_waveform_legacy` deliberately. + - **14 sensitive-range files** show a decoded/truth ratio of exactly 8.0 + (= 10.0/1.25) — a units bug, not a codec one. Never chased. + - **`backfill_sidecars.py --force` also inserts DB rows** for store files + that have none (1,286 on the snapshot; one-time per store), and the + dry-run does not report that count before you commit to it. + - **Verification is uneven:** per-sample proof on the 11% of files with a + preserved `_ASCII.TXT`, peak-and-structure consistency on the other 89%. --- diff --git a/CLAUDE.md b/CLAUDE.md index 49c4a1d..f2c7e75 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,7 +2,34 @@ Ground-up Python replacement for **Blastware**, Instantel's Windows-only software for managing MiniMate Plus seismographs. Connects over direct RS-232 or cellular modem -(Sierra Wireless RV50 / RV55). Current version: **v0.21.0**. +(Sierra Wireless RV50 / RV55). Current version: **v0.26.0**. + +--- + +## Where things stand (updated 2026-08-27) + +Read this first when picking the project back up. + +- **Series-3 decode is correct and verified.** All 11,603 series-3 binaries in + the prod snapshot pass every check (channel lengths, peaks vs the device's + own reported PPV, nothing above full scale, length vs declared record time). + Ground truth: 1,211/1,211 histograms exact per-interval and 75/75 waveform + sample counts exact against preserved Blastware ASCII exports. + ⚠ That is per-sample proof on 11% of files and peak-only consistency on the + other 89% — see `docs/instantel_protocol_reference.md` §7.6.1. +- **Series-4 (Thor / Micromate) is NOT verified.** UM-series sits at ~48% + against device peaks with a ~1.7% systematic bias and a near-zero tail. + Thor IDFW is pinned to `decode_waveform_legacy` deliberately. +- **Open, not blocking:** 14 sensitive-range files show an exact 8x + (= 10.0/1.25) units discrepancy; `scripts/backfill_sidecars.py --force` also + inserts DB rows for store files that have none (one-time per store) and the + dry-run does not report that count. +- **After any codec change, regenerate the store** — `backfill_sidecars.py + --force` then `backfill_event_shape.py`, DB backup first. Stored `.h5` files + do not update themselves. +- **Parked:** the "offset" hardware-fault investigation (Appendix E of the + protocol reference) pending the multi-year BW archive. + When new information about the protocol is discovered, please update the instantel_protocol_reference.md with the findings in addition to this document diff --git a/pyproject.toml b/pyproject.toml index ed0cc90..24a4e1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "seismo-relay" -version = "0.25.0" +version = "0.26.0" description = "Python client and REST server for MiniMate Plus seismographs" requires-python = ">=3.10" dependencies = [ diff --git a/sfm/server.py b/sfm/server.py index eabc45a..0004702 100644 --- a/sfm/server.py +++ b/sfm/server.py @@ -90,7 +90,7 @@ app = FastAPI( "Implements the minimateplus RS-232 protocol library.\n" "Proxied by terra-view at /api/sfm/*." ), - version="0.25.0", + version="0.26.0", ) # Allow requests from the waveform viewer opened as a local file (file://)