From 4a581e0e67cb5a53d84de0b46cf508820d7ee3f6 Mon Sep 17 00:00:00 2001 From: serversdown Date: Tue, 25 Aug 2026 00:45:33 +0000 Subject: [PATCH] =?UTF-8?q?chore(release):=20v0.25.0=20=E2=80=94=20reviewe?= =?UTF-8?q?d=5Freal=20+=20twin=20review-propagation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ pyproject.toml | 2 +- sfm/server.py | 2 +- tests/test_reviewed_real_in_feed.py | 15 +++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/test_reviewed_real_in_feed.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b4fa04a..e486bae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,32 @@ All notable changes to seismo-relay are documented here. --- +## v0.25.0 — 2026-08-25 + +**reviewed_real 3-state review flag + twin review-propagation.** The +`events` table and the `/db/events` feed now carry `reviewed_real`, a +3-state review flag mutually exclusive with `false_trigger`, mirrored from +the sidecar review block — plus histogram/waveform twin review-propagation +(flagging one flags both, matched by serial + identical PVS + timestamp +window). + +### Added + +- **`events` column** `reviewed_real` — `INTEGER NOT NULL DEFAULT 0`, added + via the existing incremental `_migrate` ADD COLUMN pass (auto-migrates on + `SeismoDb()` construction, no manual migration). `query_events` / + `get_event` (and thus `/db/events`) return it automatically (`SELECT *`). +- **Mutual exclusivity with `false_trigger`** — setting `reviewed_real=1` + clears `false_trigger`, and vice versa, both via `set_false_trigger` / + the sidecar review PATCH path. +- **`find_twins`** — matches an event's histogram/waveform twins by serial + + identical peak-vector-sum + a timestamp window. +- **`propagate_review_to_twins`** — copies an event's `false_trigger`/ + `reviewed_real` state onto its twins, wired into the + `PATCH /db/events/{id}/sidecar` review path so flagging one flags both. + +--- + ## v0.24.0 — 2026-08-22 **Waveform-shape metrics on events.** The `events` table and the `/db/events` diff --git a/pyproject.toml b/pyproject.toml index 2a51e33..ed0cc90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "seismo-relay" -version = "0.24.0" +version = "0.25.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 6e2ea1a..c658196 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.24.0", + version="0.25.0", ) # Allow requests from the waveform viewer opened as a local file (file://) diff --git a/tests/test_reviewed_real_in_feed.py b/tests/test_reviewed_real_in_feed.py new file mode 100644 index 0000000..42483c0 --- /dev/null +++ b/tests/test_reviewed_real_in_feed.py @@ -0,0 +1,15 @@ +from __future__ import annotations +import os, sys +from pathlib import Path + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from sfm.database import SeismoDb +from minimateplus.models import Event + + +def test_query_events_includes_reviewed_real(tmp_path: Path): + db = SeismoDb(tmp_path / "s.db") + ev = Event(index=0) + ev._waveform_key = bytes.fromhex("01110000") + db.insert_events([ev], serial="BE1") + assert "reviewed_real" in db.query_events(serial="BE1")[0]