Release/v3.3.0 - #46
Conversation
Backend: - Added data export API endpoints to download readings, alerts, and anomalies in CSV format. - Expanded the pytest test suite to 41 passing tests. Frontend: - Integrated fleet management API (registration modal, status indicators, and deletion). - Added CSV export functionality across the dashboard, alerts, and anomalies pages. Firmware (C/C++): - Implemented EvidenceStore utilizing a circular buffer to preserve up to 32 EvidenceSnapshot records. - Added FNV-1a hash chain verification to ensure data integrity and enable tamper detection. - Introduced 8 new unit tests for the evidence preservation logic. CI & Documentation: - Added 'backend-test' job (Python 3.11, pytest) to the CI pipeline, bringing the total to 7 jobs. - Updated ROADMAP.md and CHANGELOG.md to reflect v3.2.0 completion. Closes #33 Refs #44
…implement backend notification engine, and introduce new frontend entry point with updated documentation.
…ure across the firmware, backend, and frontend.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2825f6ef69
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -1,57 +0,0 @@ | |||
| /** | |||
There was a problem hiding this comment.
Restore fuzz_packet_parse target source
Deleting this file breaks the existing fuzz build definition: firmware/fuzz/CMakeLists.txt still declares add_executable(fuzz_packet_parse fuzz_packet_parse.cpp ...), so configuring firmware/fuzz now fails at CMake generate time with a missing source-file error. Any fuzzing workflow that builds this target will fail before tests can run.
Useful? React with 👍 / 👎.
| db.query(func.avg(models.MeterReading.energy_wh)) | ||
| .filter( | ||
| models.MeterReading.meter_id == reading.meter_id, | ||
| models.MeterReading.id != reading.id, | ||
| ) |
There was a problem hiding this comment.
Limit anomaly baseline to recent readings window
analyze_reading claims to compare against the last N readings and defines RECENT_READINGS_WINDOW, but this query averages all historical readings for the meter. In production data this makes old history dominate the baseline, which can hide real short-term anomalies (or create false positives after load pattern shifts), so detection accuracy regresses as data accumulates.
Useful? React with 👍 / 👎.
| class WebhookConfigResponse(BaseModel): | ||
| id: int | ||
| url: str | ||
| secret: str |
There was a problem hiding this comment.
Stop returning webhook secrets in API responses
Including secret in WebhookConfigResponse leaks the webhook signing secret to every caller of webhook create/list endpoints. Any client with read access to webhook configs can extract that secret and forge downstream webhook traffic that appears trusted, defeating the purpose of secret-based verification.
Useful? React with 👍 / 👎.
No description provided.