From 8c0bdaef9266f9b249192c7158daf2fdaf74c5ff Mon Sep 17 00:00:00 2001 From: ruv Date: Sat, 18 Jul 2026 18:01:23 -0400 Subject: [PATCH] fix open issue release blockers --- .github/workflows/firmware-ci.yml | 16 ++++++++++++---- .../v1/tests/unit/test_health_concurrency.py | 9 +++------ docs/user-guide.md | 17 +++++++++++++++++ firmware/esp32-csi-node/version.txt | 2 +- .../wifi-densepose-sensing-server/src/main.rs | 19 +++++++++++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/.github/workflows/firmware-ci.yml b/.github/workflows/firmware-ci.yml index 43ac4031..57730feb 100644 --- a/.github/workflows/firmware-ci.yml +++ b/.github/workflows/firmware-ci.yml @@ -52,14 +52,16 @@ jobs: target: esp32s3 sdkconfig: sdkconfig.defaults partition_table_name: partitions_display.csv - size_limit_kb: 1100 + size_warn_kb: 1100 + size_limit_kb: 1152 artifact_app: esp32-csi-node.bin artifact_pt: partition-table.bin - variant: 4mb target: esp32s3 sdkconfig: sdkconfig.defaults.4mb partition_table_name: partitions_4mb.csv - size_limit_kb: 1100 + size_warn_kb: 1100 + size_limit_kb: 1152 artifact_app: esp32-csi-node-4mb.bin artifact_pt: partition-table-4mb.bin # ADR-110: ESP32-C6 research target (Wi-Fi 6 / 802.15.4 / TWT / LP-core) @@ -67,7 +69,8 @@ jobs: target: esp32c6 sdkconfig: sdkconfig.defaults partition_table_name: partitions_4mb.csv - size_limit_kb: 1100 + size_warn_kb: 1100 + size_limit_kb: 1152 artifact_app: esp32-csi-node-c6.bin artifact_pt: partition-table-c6.bin @@ -96,18 +99,23 @@ jobs: make test_adr110 ./test_adr110 - - name: Verify binary size (< ${{ matrix.size_limit_kb }} KB gate) + - name: Verify binary size budget working-directory: firmware/esp32-csi-node run: | BIN=build/esp32-csi-node.bin SIZE=$(stat -c%s "$BIN") MAX=$((${{ matrix.size_limit_kb }} * 1024)) + WARN=$((${{ matrix.size_warn_kb }} * 1024)) echo "Binary size: $SIZE bytes ($(( SIZE / 1024 )) KB)" + echo "Warning at: $WARN bytes (${{ matrix.size_warn_kb }} KB)" echo "Size limit: $MAX bytes (${{ matrix.size_limit_kb }} KB)" if [ "$SIZE" -gt "$MAX" ]; then echo "::error::Firmware binary exceeds ${{ matrix.size_limit_kb }} KB size gate ($SIZE > $MAX)" exit 1 fi + if [ "$SIZE" -gt "$WARN" ]; then + echo "::warning::Firmware binary exceeds the ${{ matrix.size_warn_kb }} KB soft budget ($SIZE > $WARN); hard limit is ${{ matrix.size_limit_kb }} KB" + fi echo "Binary size OK: $SIZE <= $MAX" - name: Verify flash image integrity diff --git a/archive/v1/tests/unit/test_health_concurrency.py b/archive/v1/tests/unit/test_health_concurrency.py index ba5429bc..438356ae 100644 --- a/archive/v1/tests/unit/test_health_concurrency.py +++ b/archive/v1/tests/unit/test_health_concurrency.py @@ -3,6 +3,8 @@ import time import os import sys +import pytest + # Add project root and archive/v1 to sys.path so we can import src modules sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../"))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))) @@ -47,12 +49,7 @@ async def run_test(): # In pre-fix code, psutil.cpu_percent(interval=1) blocks for 1.0s, # causing a gap of >1.0s. With our fix, it should be close to 0.1s. - if max_gap >= 0.35: - print("FAIL: Event loop was frozen/blocked!") - sys.exit(1) - else: - print("SUCCESS: Event loop remained fully responsive during metrics query!") - sys.exit(0) + return max_gap, duration @pytest.mark.asyncio async def test_get_system_metrics_does_not_starve_event_loop(): diff --git a/docs/user-guide.md b/docs/user-guide.md index cf71df73..d9542a6e 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -1861,6 +1861,23 @@ node scripts/eval-wiflow.js \ --data data/paired/*.jsonl ``` +> **Model format boundary:** `train-wiflow-supervised.js` produces the +> JavaScript WiFlow model `wiflow-v1.json`. There is currently no supported +> command that converts that JSON model into the sensing server's binary RVF +> container, and renaming the file to `.rvf` does not convert it. Use the JSON +> model with the JavaScript evaluation/inference tools. To train a model that +> the Rust sensing server can load, use its native training path, which writes +> RVF directly: +> +> ```bash +> cargo run -p wifi-densepose-sensing-server --release -- \ +> --train --dataset data/mmfi --dataset-type mmfi \ +> --epochs 100 --save-rvf models/room-model.rvf +> ``` +> +> The camera+CSI paired JSONL workflow and the native RVF trainer are separate +> pipelines today. A JSON-to-RVF exporter is future work. + **Evaluation protocol matters.** Use `eval-wiflow.js` (torso-normalized PCK@20, the metric comparable to published WiFi-pose results) on a temporal hold-out, and sanity-check that predictions actually vary across frames diff --git a/firmware/esp32-csi-node/version.txt b/firmware/esp32-csi-node/version.txt index faef31a4..b60d7196 100644 --- a/firmware/esp32-csi-node/version.txt +++ b/firmware/esp32-csi-node/version.txt @@ -1 +1 @@ -0.7.0 +0.8.4 diff --git a/v2/crates/wifi-densepose-sensing-server/src/main.rs b/v2/crates/wifi-densepose-sensing-server/src/main.rs index 39270daa..419c5b10 100644 --- a/v2/crates/wifi-densepose-sensing-server/src/main.rs +++ b/v2/crates/wifi-densepose-sensing-server/src/main.rs @@ -5044,6 +5044,18 @@ async fn calibration_status(State(state): State) -> Json Json { + Json(serde_json::json!({ + "activities": [], + "total": 0, + "persisted": false, + "message": "Activity history is not persisted by the Rust sensing server.", + })) +} + /// Generate a simple timestamp string (epoch seconds) for recording IDs. fn chrono_timestamp() -> u64 { std::time::SystemTime::now() @@ -7782,6 +7794,13 @@ async fn main() { .route("/api/v1/pose/current", get(pose_current)) .route("/api/v1/pose/stats", get(pose_stats)) .route("/api/v1/pose/zones/summary", get(pose_zones_summary)) + .route("/api/v1/pose/activities", get(pose_activities)) + // Dashboard-compatible aliases for the field-model calibration API. + .route("/api/v1/pose/calibrate", post(calibration_start)) + .route( + "/api/v1/pose/calibration/status", + get(calibration_status), + ) // Stream endpoints .route("/api/v1/stream/status", get(stream_status)) .route("/api/v1/stream/pose", get(ws_pose_handler))