|
|
|
@@ -6,6 +6,43 @@ All notable changes to seismo-relay are documented here.
|
|
|
|
|
|
|
|
|
|
## [Unreleased]
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
- **Sub-minute histograms with a partial final block decoded to nothing**
|
|
|
|
|
(`histogram_codec.detect_multi_interval_stride`). The stride search confirmed
|
|
|
|
|
itself on a third block header whenever the body was long enough to hold one —
|
|
|
|
|
but a body can exceed two strides and still contain only two real blocks, because
|
|
|
|
|
a *partial* final block leaves trailing padding. BE18193 `T193L0XM.CI0H` (51
|
|
|
|
|
intervals at 2 s = one full 30-interval block plus a 21-interval remainder, in a
|
|
|
|
|
2787-byte body) therefore had its correct stride of 612 discarded and produced an
|
|
|
|
|
empty decode. A missing third header now means end-of-stream rather than
|
|
|
|
|
disqualification; the block-counter check, which is what actually prevents the
|
|
|
|
|
false positives that once mis-dispatched 9,082 files, is unchanged.
|
|
|
|
|
|
|
|
|
|
Found by decoding the full DL2 archive against its preserved Blastware ASCII
|
|
|
|
|
exports. Across **63,535 unique** histogram binaries the fix recovers **4 files** —
|
|
|
|
|
`K440HJCN.3C0H` and `K557IF1U.8K0H` (stride 252), `T191HVNP.0S0H` (92) and
|
|
|
|
|
`T193L0XM.CI0H` (612) — with **zero** files regressed. Verification over all
|
|
|
|
|
14,340 archive pairs goes 14,337 → 14,338 exact, the only remainder being two
|
|
|
|
|
series-4 IDF files that belong to a different codec.
|
|
|
|
|
|
|
|
|
|
(The DL2 export keeps a byte-identical `Sent/` mirror of its root, so a naive
|
|
|
|
|
walk double-counts every binary — 127,035 paths are 63,535 distinct files. The
|
|
|
|
|
ASCII exports are *not* mirrored, so the 14,340 pair count is already distinct.)
|
|
|
|
|
|
|
|
|
|
⚠ Prod stores hold `.h5` files generated before this fix. Those 4 events stay
|
|
|
|
|
empty until `backfill_sidecars.py` is re-run — not worth a two-hour prod backfill
|
|
|
|
|
on its own; fold it into the next one.
|
|
|
|
|
|
|
|
|
|
- **Histogram/waveform twin matching is now interval-based** (`find_twins`). A real
|
|
|
|
|
trigger is recorded twice — as a triggered waveform (stamped at the trigger instant)
|
|
|
|
|
and inside the scheduled histogram whose interval contains it (stamped at the 7am/7pm
|
|
|
|
|
interval start) — so the two twins can be **hours apart**. The old ±5-minute window
|
|
|
|
|
silently missed them, which broke review propagation (flagging one twin didn't flag its
|
|
|
|
|
twin). Twins are now matched by same serial + identical `peak_vector_sum` + opposite
|
|
|
|
|
record type + the waveform falling within the histogram's interval (bounded by the next
|
|
|
|
|
same-serial histogram). `window_seconds` is retained but ignored. Fixes terra-view #102
|
|
|
|
|
sub-task 2.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## v0.26.0 — 2026-08-27
|
|
|
|
|