Compare commits
4
Commits
v0.26.0
...
5f1ee5ba91
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f1ee5ba91 | ||
|
|
4839ddfa0e | ||
|
|
14e997b20c | ||
|
|
75ac610c61 |
@@ -6,6 +6,43 @@ All notable changes to seismo-relay are documented here.
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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
|
## v0.26.0 — 2026-08-27
|
||||||
|
|||||||
@@ -27,8 +27,11 @@ Read this first when picking the project back up.
|
|||||||
- **After any codec change, regenerate the store** — `backfill_sidecars.py
|
- **After any codec change, regenerate the store** — `backfill_sidecars.py
|
||||||
--force` then `backfill_event_shape.py`, DB backup first. Stored `.h5` files
|
--force` then `backfill_event_shape.py`, DB backup first. Stored `.h5` files
|
||||||
do not update themselves.
|
do not update themselves.
|
||||||
- **Parked:** the "offset" hardware-fault investigation (Appendix E of the
|
- **The "offset" hardware fault has its own journal** --
|
||||||
protocol reference) pending the multi-year BW archive.
|
`docs/offset_investigation.md`. Base rate settled at 5-6 of 45 units
|
||||||
|
(11-13%) across the DL2 archive; Instantel's own autozero procedure and
|
||||||
|
its 2027-2069 go/no-go window are recorded there. Best open lead is
|
||||||
|
`SUB 0x0E` (unimplemented), which may carry those numbers.
|
||||||
|
|
||||||
|
|
||||||
When new information about the protocol is discovered, please update the instantel_protocol_reference.md with the findings in addition to this document
|
When new information about the protocol is discovered, please update the instantel_protocol_reference.md with the findings in addition to this document
|
||||||
@@ -1803,4 +1806,4 @@ body) because writing a dial string may require DLE escaping for embedded contro
|
|||||||
|
|
||||||
To parse BW TX captures: use `bridges/captures/` scripts or adapt the `find_write_frames()` pattern
|
To parse BW TX captures: use `bridges/captures/` scripts or adapt the `find_write_frames()` pattern
|
||||||
in `/tmp/analyze_write_payload.py` — it correctly handles `0x10 0x03` DLE-escaped ETX bytes
|
in `/tmp/analyze_write_payload.py` — it correctly handles `0x10 0x03` DLE-escaped ETX bytes
|
||||||
inside write frame data (the naive parser terminates early at the escaped `0x03`). | |||||||