docs(changelog): Unreleased — cheap connect, Diagnostics tab, tool status
Written on dev as part of finishing the merge, per the convention adopted 2026-09-18: feature branches do not touch CHANGELOG.md, and the entry describes what actually landed rather than what a branch intended. First time through the new way rather than discovering the conflict afterward — the merge was clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qcu9ByJfuKBQxmrWb8rSrN
This commit is contained in:
@@ -4,6 +4,52 @@ All notable changes to seismo-relay are documented here.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **Diagnostics tab in the SFM standalone webapp.** Surfaces the device
|
||||||
|
endpoints that previously existed only as `curl`: `events/storage_range` and
|
||||||
|
`events/index` alongside `monitor/status`, then stop monitoring, disable ACH
|
||||||
|
(`rescue?erase=false`, so stored events survive), and erase. The wedged-unit
|
||||||
|
ladder — slow drip and blind stop — sits under its own heading pointing at
|
||||||
|
`docs/runbooks/wedged_unit_recovery.md`, with the reminder that `slow_drip`'s
|
||||||
|
success signal is `bytes_received > 0` and not a clean duration. Erase is
|
||||||
|
guarded by typing the unit's serial: auth answers *who*, not *did you mean
|
||||||
|
it*, and Swagger's try-it-out button on `/device/events/erase` is live on
|
||||||
|
`:8200/docs`.
|
||||||
|
|
||||||
|
- **`docs/sfm_tool_status.md`** — an honest per-capability maturity assessment:
|
||||||
|
what is production-grade (the codec library, the data side), what is
|
||||||
|
emergency-grade (the device side), what is a research artifact, the
|
||||||
|
known-issues table, and the gap to a real tool. Also records the **5A
|
||||||
|
page-boundary bug** as known: `parse_strt_end_offset()` discards the key's
|
||||||
|
page byte, so once a unit has recorded more than 64 KB since its last erase,
|
||||||
|
an event spanning the boundary reads an `end_offset` *behind* its own start —
|
||||||
|
the chunk loop fetches nothing and TERM packs a negative `offset_word`, which
|
||||||
|
500s. Reproduced on BE12599. Production is unaffected: it ingests complete
|
||||||
|
files via the watcher path and never runs this walk.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Connecting to a unit no longer walks its event chain.** `/device/events`
|
||||||
|
reads every event header over the cellular link; on a unit with a large or
|
||||||
|
wrapped chain that takes minutes or fails outright, and it fired
|
||||||
|
automatically on every connect. Connect now uses only ~2 s probes —
|
||||||
|
`/device/info` (which already carried the compliance config the walk was
|
||||||
|
re-reading) plus `events/storage_range` — and the Device tab gains an Event
|
||||||
|
Chain card. The walk moved behind a **Load events** button in the Events
|
||||||
|
toolbar. Knowing whether a unit's ACH is on no longer requires reading every
|
||||||
|
event it has stored.
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
|
||||||
|
**None.** Frontend and documentation only — no codec, waveform-store or DB
|
||||||
|
change, no schema change, and no `TOOL_VERSION` bump. The webapp is served
|
||||||
|
from the image, so the change appears after the next `sfm` rebuild.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v0.31.0 — 2026-09-18
|
## v0.31.0 — 2026-09-18
|
||||||
|
|
||||||
**Report parity, and a second way to rescue a runaway unit.** Two threads.
|
**Report parity, and a second way to rescue a runaway unit.** Two threads.
|
||||||
|
|||||||
Reference in New Issue
Block a user