chore(release): v0.26.0 — series-3 decode correctness

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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HgTe8CamXAHcAmaQ6QNcog
This commit is contained in:
2026-08-27 16:35:47 +00:00
co-authored by Claude Opus 5
parent a3b69a62a6
commit b2ef02ebcc
4 changed files with 56 additions and 8 deletions
+26 -5
View File
@@ -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%.
---