# Changelog

## 1.5.0 — 2026-09-21

### Added

- Per-measurement timestamps with `[id,value,timestamp]` array items. Legacy
  `[id,value]` pairs retain the message timestamp / arrival-time fallback.
- Tests for one-message arrays containing 10,000 and 15,000 measurements, concurrency,
  offline recovery, restarts, shutdown, overflow, validation and HTTP acknowledgements.

### Fixed

- File-buffer compaction no longer discards the row after an acknowledged chunk.
- Serialized delivery prevents concurrent inputs from overwriting or duplicating data.
- Existing buffered data resumes on startup without requiring a new measurement.
- FIFO order is maintained across new input and older disk data.
- Graceful shutdown retains unsent data and persists already queued input.
- Small numeric values are preserved rather than rounded to zero; CSV uses plain decimals.
- Epoch zero and older seconds are accepted; malformed explicit timestamps and IDs are rejected.
- Oversized individual rows and incomplete file tails fail clearly instead of corrupting CSV.
- HTTP redirects cannot falsely acknowledge a POST via an empty GET.
- deZem test-server `OK` responses with hexadecimal echo are supported.
- Runtime errors reach Node-RED Catch nodes even when debug logging is disabled.
- A second node cannot use the same buffer directory within the same process.

### Changed

- Validated input is written to disk before delivery; large batches send consecutive
  requests up to 100 KiB without waiting a flush interval between chunks.
- The queue is compacted once per drain attempt rather than copied after every request.
- Removed the unused fs-extra dependency and clarified editor validation/help.

### Upgrade notes

- Configuration field names, existing `[id,value]` input and `ring.dat` format are preserved.
- Use the final HTTP/HTTPS endpoint: redirects are no longer followed.
- Give each node/process its own writable storage directory.
- Invalid explicit timestamps now produce errors instead of silently using current time.
- Disk writes increase for small messages. Pending input still waits in memory behind an
  active request until written. Writes are not fsync transactions.
- Delivery is not exactly once: uncertain HTTP acknowledgements or a crash before
  compaction may replay data. Buffer overflow intentionally drops oldest complete rows.

## 1.4.5

Previous published version; retained as the baseline for the 1.5.0 regression tests.
